mirror of https://git.ffmpeg.org/ffmpeg.git
Merge commit '0569a7e0bd2006d9a5248d17a1f4bf3ca654ae50'
* commit '0569a7e0bd2006d9a5248d17a1f4bf3ca654ae50': hevc: parse display orientation SEI message Conflicts: libavcodec/hevc.h libavcodec/hevc_sei.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
efc66d69bf
|
@ -26,6 +26,7 @@
|
|||
#include "libavutil/atomic.h"
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/display.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/md5.h"
|
||||
#include "libavutil/opt.h"
|
||||
|
@ -2339,6 +2340,20 @@ static int set_side_data(HEVCContext *s)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -885,6 +885,11 @@ typedef struct HEVCContext {
|
|||
int content_interpretation_type;
|
||||
int quincunx_subsampling;
|
||||
|
||||
/** display orientation */
|
||||
int sei_display_orientation_present;
|
||||
int sei_anticlockwise_rotation;
|
||||
int sei_hflip, sei_vflip;
|
||||
|
||||
int picture_struct;
|
||||
} HEVCContext;
|
||||
|
||||
|
|
|
@ -74,6 +74,21 @@ static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
|
|||
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)
|
||||
{
|
||||
GetBitContext *gb = &s->HEVClc->gb;
|
||||
|
@ -149,6 +164,9 @@ static int decode_nal_sei_message(HEVCContext *s)
|
|||
} else if (payload_type == 45) {
|
||||
decode_nal_sei_frame_packing_arrangement(s);
|
||||
return 1;
|
||||
} else if (payload_type == 47) {
|
||||
decode_nal_sei_display_orientation(s);
|
||||
return 1;
|
||||
} else if (payload_type == 1){
|
||||
int ret = decode_pic_timing(s);
|
||||
av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
|
||||
|
|
Loading…
Reference in New Issue