[vlc-devel] [PATCH] lavf: Support rotation side data
Rafaël Carré
funman at videolan.org
Tue May 20 10:29:24 CEST 2014
Hi,
On 05/20/14 10:22, Luca Barbato wrote:
> Support stream side data only.
> ---
>
> Now the accessor is available so I can send the patch.
>
> configure.ac | 2 ++
> modules/demux/avformat/demux.c | 69 ++++++++++++++++++++++++++++++------------
> 2 files changed, 51 insertions(+), 20 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index fbb2a3b..2f344a0 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2426,9 +2426,11 @@ AS_IF([test "${enable_avformat}" != "no"], [
> VLC_SAVE_FLAGS
> CPPFLAGS="${CPPFLAGS} ${AVFORMAT_CFLAGS}"
> CFLAGS="${CFLAGS} ${AVFORMAT_CFLAGS}"
> + LIBS="${LIBS} ${AVFORMAT_LIBS}"
> AC_CHECK_HEADERS(libavformat/avformat.h libavformat/avio.h)
> AC_CHECK_HEADERS(libavcodec/avcodec.h)
> AC_CHECK_HEADERS(libavutil/avutil.h)
> + AC_CHECK_FUNCS([av_stream_get_side_data])
Can we use LIBAVFORMAT_VERSION_* instead ?
> AS_IF([test "$enable_merge_ffmpeg" = "no"], [
> have_avformat="no"
> ])
> diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c
> index 9eebac6..06b635a 100644
> --- a/modules/demux/avformat/demux.c
> +++ b/modules/demux/avformat/demux.c
> @@ -40,6 +40,10 @@
>
> #include <libavformat/avformat.h>
>
> +#if HAVE_AV_STREAM_GET_SIDE_DATA
> +#include <libavutil/display.h>
> +#endif
> +
> #include "../../codec/avcodec/avcodec.h"
> #include "../../codec/avcodec/chroma.h"
> #include "../../codec/avcodec/avcommon.h"
> @@ -109,6 +113,50 @@ static vlc_fourcc_t CodecTagToFourcc( uint32_t codec_tag )
> /*****************************************************************************
> * Open
> *****************************************************************************/
> +
> +
> +static void get_rotation(es_format_t *fmt, AVStream *s)
> +{
> + char const *kRotateKey = "rotate";
> + AVDictionaryEntry *rotation = av_dict_get(s->metadata, kRotateKey, NULL, 0);
> + long angle = 0;
> +
> + if( rotation )
> + {
> + angle = strtol(rotation->value, NULL, 10);
> +
> + if (angle > 45 && angle < 135)
> + fmt->video.orientation = ORIENT_ROTATED_90;
> +
> + else if (angle > 135 && angle < 225)
> + fmt->video.orientation = ORIENT_ROTATED_180;
> +
> + else if (angle > 225 && angle < 315)
> + fmt->video.orientation = ORIENT_ROTATED_270;
> +
> + else
> + fmt->video.orientation = ORIENT_NORMAL;
> + }
> +#if HAVE_AV_STREAM_GET_SIDE_DATA
> + int32_t *matrix = (int32_t *)av_stream_get_side_data(s, AV_PKT_DATA_DISPLAYMATRIX, NULL);
> + if( matrix ) {
> + angle = lround(av_display_rotation_get(matrix));
> +
> + if (angle > 45 && angle < 135)
> + fmt->video.orientation = ORIENT_ROTATED_270;
> +
> + else if (angle > 135 || angle < -135)
> + fmt->video.orientation = ORIENT_ROTATED_180;
> +
> + else if (angle < -45 && angle > -135)
> + fmt->video.orientation = ORIENT_ROTATED_90;
> +
> + else
> + fmt->video.orientation = ORIENT_NORMAL;
> + }
> +#endif
> +}
> +
> int OpenDemux( vlc_object_t *p_this )
> {
> demux_t *p_demux = (demux_t*)p_this;
> @@ -336,26 +384,7 @@ int OpenDemux( vlc_object_t *p_this )
> fmt.video.i_width = cc->width;
> fmt.video.i_height = cc->height;
>
> - char const *kRotateKey = "rotate";
> - AVDictionaryEntry *rotation = av_dict_get(s->metadata, kRotateKey, NULL, 0);
> -
> - if( rotation )
> - {
> -
> - long angle = strtol(rotation->value, NULL, 10);
> -
> - if (angle > 45 && angle < 135)
> - fmt.video.orientation = ORIENT_ROTATED_90;
> -
> - else if (angle > 135 && angle < 225)
> - fmt.video.orientation = ORIENT_ROTATED_180;
> -
> - else if (angle > 225 && angle < 315)
> - fmt.video.orientation = ORIENT_ROTATED_270;
> -
> - else
> - fmt.video.orientation = ORIENT_NORMAL;
> - }
> + get_rotation(&fmt, s);
>
> #if LIBAVCODEC_VERSION_MAJOR < 54
> if( cc->palctrl )
More information about the vlc-devel
mailing list