Commit efc66d69 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '0569a7e0'

* commit '0569a7e0':
  hevc: parse display orientation SEI message

Conflicts:
	libavcodec/hevc.h
	libavcodec/hevc_sei.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents cd0dc887 0569a7e0
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "libavutil/atomic.h" #include "libavutil/atomic.h"
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/display.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/md5.h" #include "libavutil/md5.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
...@@ -2339,6 +2340,20 @@ static int set_side_data(HEVCContext *s) ...@@ -2339,6 +2340,20 @@ static int set_side_data(HEVCContext *s)
stereo->flags = AV_STEREO3D_FLAG_INVERT; stereo->flags = AV_STEREO3D_FLAG_INVERT;
} }
if (s->sei_display_orientation_present &&
(s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
AVFrameSideData *rotation = av_frame_new_side_data(out,
AV_FRAME_DATA_DISPLAYMATRIX,
sizeof(int32_t) * 9);
if (!rotation)
return AVERROR(ENOMEM);
av_display_rotation_set((int32_t *)rotation->data, angle);
av_display_matrix_flip((int32_t *)rotation->data,
s->sei_vflip, s->sei_hflip);
}
return 0; return 0;
} }
......
...@@ -885,6 +885,11 @@ typedef struct HEVCContext { ...@@ -885,6 +885,11 @@ typedef struct HEVCContext {
int content_interpretation_type; int content_interpretation_type;
int quincunx_subsampling; int quincunx_subsampling;
/** display orientation */
int sei_display_orientation_present;
int sei_anticlockwise_rotation;
int sei_hflip, sei_vflip;
int picture_struct; int picture_struct;
} HEVCContext; } HEVCContext;
......
...@@ -74,6 +74,21 @@ static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s) ...@@ -74,6 +74,21 @@ static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
skip_bits1(gb); // upsampled_aspect_ratio_flag skip_bits1(gb); // upsampled_aspect_ratio_flag
} }
static void decode_nal_sei_display_orientation(HEVCContext *s)
{
GetBitContext *gb = &s->HEVClc->gb;
s->sei_display_orientation_present = !get_bits1(gb);
if (s->sei_display_orientation_present) {
s->sei_hflip = get_bits1(gb); // hor_flip
s->sei_vflip = get_bits1(gb); // ver_flip
s->sei_anticlockwise_rotation = get_bits(gb, 16);
skip_bits1(gb); // display_orientation_persistence_flag
}
}
static int decode_pic_timing(HEVCContext *s) static int decode_pic_timing(HEVCContext *s)
{ {
GetBitContext *gb = &s->HEVClc->gb; GetBitContext *gb = &s->HEVClc->gb;
...@@ -149,6 +164,9 @@ static int decode_nal_sei_message(HEVCContext *s) ...@@ -149,6 +164,9 @@ static int decode_nal_sei_message(HEVCContext *s)
} else if (payload_type == 45) { } else if (payload_type == 45) {
decode_nal_sei_frame_packing_arrangement(s); decode_nal_sei_frame_packing_arrangement(s);
return 1; return 1;
} else if (payload_type == 47) {
decode_nal_sei_display_orientation(s);
return 1;
} else if (payload_type == 1){ } else if (payload_type == 1){
int ret = decode_pic_timing(s); int ret = decode_pic_timing(s);
av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type); av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment