diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-07-10 00:07:04 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-07-10 00:07:04 +0200 |
commit | cd0dc88751db969964e7b40c4d4b5fd446ac1589 (patch) | |
tree | 287290217843c6aeefc76b1f0ed9ada495820bba | |
parent | c67690f854452df397f3f735d0ff107a3fe51d87 (diff) | |
parent | 18e3d61e9e3b52c177aa7a1f2a054a8a753e1b09 (diff) | |
download | ffmpeg-streaming-cd0dc88751db969964e7b40c4d4b5fd446ac1589.zip ffmpeg-streaming-cd0dc88751db969964e7b40c4d4b5fd446ac1589.tar.gz |
Merge commit '18e3d61e9e3b52c177aa7a1f2a054a8a753e1b09'
* commit '18e3d61e9e3b52c177aa7a1f2a054a8a753e1b09':
h264: parse display orientation SEI message
Conflicts:
libavcodec/h264.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h264.c | 15 | ||||
-rw-r--r-- | libavcodec/h264.h | 8 | ||||
-rw-r--r-- | libavcodec/h264_sei.c | 22 |
3 files changed, 45 insertions, 0 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 7718b51..1d91987 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -28,6 +28,7 @@ #define UNCHECKED_BITSTREAM_READER 1 #include "libavutil/avassert.h" +#include "libavutil/display.h" #include "libavutil/imgutils.h" #include "libavutil/opt.h" #include "libavutil/stereo3d.h" @@ -866,6 +867,20 @@ static void decode_postinit(H264Context *h, int setup_finished) stereo->flags = AV_STEREO3D_FLAG_INVERT; } + if (h->sei_display_orientation_present && + (h->sei_anticlockwise_rotation || h->sei_hflip || h->sei_vflip)) { + double angle = h->sei_anticlockwise_rotation * 360 / (double) (1 << 16); + AVFrameSideData *rotation = av_frame_new_side_data(&cur->f, + AV_FRAME_DATA_DISPLAYMATRIX, + sizeof(int32_t) * 9); + if (!rotation) + return; + + av_display_rotation_set((int32_t *)rotation->data, angle); + av_display_matrix_flip((int32_t *)rotation->data, + h->sei_vflip, h->sei_hflip); + } + cur->mmco_reset = h->mmco_reset; h->mmco_reset = 0; diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 943adaa..bf4255b 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -136,6 +136,7 @@ typedef enum { SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement + SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation } SEI_Type; /** @@ -674,6 +675,13 @@ typedef struct H264Context { int quincunx_subsampling; /** + * display orientation SEI message + */ + int sei_display_orientation_present; + int sei_anticlockwise_rotation; + int sei_hflip, sei_vflip; + + /** * Bit set of clock types for fields/frames in picture timing SEI message. * For each found ct_type, appropriate bit is set (e.g., bit 1 for * interlaced). diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c index 88bf0f4..aa889b8 100644 --- a/libavcodec/h264_sei.c +++ b/libavcodec/h264_sei.c @@ -41,6 +41,7 @@ void ff_h264_reset_sei(H264Context *h) h->sei_cpb_removal_delay = -1; h->sei_buffering_period_present = 0; h->sei_frame_packing_present = 0; + h->sei_display_orientation_present = 0; } static int decode_picture_timing(H264Context *h) @@ -262,6 +263,22 @@ static int decode_frame_packing_arrangement(H264Context *h) return 0; } +static int decode_display_orientation(H264Context *h) +{ + h->sei_display_orientation_present = !get_bits1(&h->gb); + + if (h->sei_display_orientation_present) { + h->sei_hflip = get_bits1(&h->gb); // hor_flip + h->sei_vflip = get_bits1(&h->gb); // ver_flip + + h->sei_anticlockwise_rotation = get_bits(&h->gb, 16); + get_ue_golomb(&h->gb); // display_orientation_repetition_period + skip_bits1(&h->gb); // display_orientation_extension_flag + } + + return 0; +} + int ff_h264_decode_sei(H264Context *h) { while (get_bits_left(&h->gb) > 16) { @@ -322,6 +339,11 @@ int ff_h264_decode_sei(H264Context *h) if (ret < 0) return ret; break; + case SEI_TYPE_DISPLAY_ORIENTATION: + ret = decode_display_orientation(h); + if (ret < 0) + return ret; + break; default: av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type); } |