From a9ad4c7e70e081972bc31dc50594b566d8a07abc Mon Sep 17 00:00:00 2001 From: Bang Peng Date: Mon, 22 May 2017 05:01:17 +0000 Subject: PD#144652:fixed amnuplayer to support dobly vision files.merge 138732 Change-Id: Ic92281875baf3bb5248da578a7354163b93840c7 --- diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 14d7aa1..3d88f95 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3636,6 +3636,7 @@ typedef struct AVCodecContext { * AVCodecContext.get_format callback) */ int hwaccel_flags; + int has_dolby_vision_meta; } AVCodecContext; AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); @@ -5104,6 +5105,9 @@ typedef struct AVCodecParserContext { #define PARSER_FLAG_FETCHED_OFFSET 0x0004 #define PARSER_FLAG_USE_CODEC_TS 0x1000 + /*for dolby vision flag*/ +#define PARSER_FLAG_HAS_DV_META 0x0008 + int64_t offset; ///< byte offset from starting packet start int64_t cur_frame_end[AV_PARSER_PTS_NB]; diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 3bbe228..62ea89b 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -45,6 +45,7 @@ enum { H264_NAL_SUB_SPS = 15, H264_NAL_AUXILIARY_SLICE = 19, H264_NAL_SLC_EXT = 20, + H264_NAL_264_DV = 0x1c, /*0x7c & 0x1f*/ }; #endif /* AVCODEC_H264_H */ diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index bc35a61..aed0793 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -324,6 +324,13 @@ static inline int parse_nal_units(AVCodecParserContext *s, case H264_NAL_SEI: ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); break; + case H264_NAL_264_DV: + /*00 00 00 01 7c 01 19 08 + nal type = 0x7c & 0x1f; + any conflict? + */ + avctx->has_dolby_vision_meta = 1; + break; case H264_NAL_IDR_SLICE: s->key_frame = 1; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index e994f7e..492b4eb 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -543,6 +543,7 @@ typedef struct H264Context { AVBufferPool *motion_val_pool; AVBufferPool *ref_index_pool; int ref2frm[MAX_SLICES][2][64]; ///< reference to frame number lists, used in the loop filter, the first 2 are for -2,-1 + int has_dolby_vision_meta; } H264Context; extern const uint16_t ff_h264_mb_sizes[4]; diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h index de77d2a..165ba45 100644 --- a/libavcodec/hevc.h +++ b/libavcodec/hevc.h @@ -50,6 +50,7 @@ enum HEVCNALUnitType { HEVC_NAL_FD_NUT = 38, HEVC_NAL_SEI_PREFIX = 39, HEVC_NAL_SEI_SUFFIX = 40, + HEVC_NAL_SEI_DV_META = 62, }; enum HEVCSliceType { diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 310428d..3e10ee4 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -267,6 +267,14 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, case HEVC_NAL_SEI_SUFFIX: ff_hevc_decode_nal_sei(h); break; + case HEVC_NAL_SEI_DV_META: + /* + sample dolbyvision nal header: + 00 00 01 8C 7C 01 19 08 + nal_type =(0x7C >> 1) 0x3f; + */ + avctx->has_dolby_vision_meta = 1; + break; case HEVC_NAL_TRAIL_N: case HEVC_NAL_TRAIL_R: case HEVC_NAL_TSA_N: diff --git a/libavformat/isom.c b/libavformat/isom.c index 7da2700..dd9b846 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -162,6 +162,8 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, /* HEVC/H.265 which indicates parameter sets may be in ES */ { AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, /* HEVC/H.265 which indicates parameter sets shall not be in ES */ + { AV_CODEC_ID_HEVC, MKTAG('d', 'v', 'h', 'e') }, /* HEVC Dobly vision ES dvhe*/ + { AV_CODEC_ID_HEVC, MKTAG('D', 'O', 'V', 'I') }, /* HEVC Dobly vision ES dovi*/ { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */ { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '2') }, diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index c10e3f2..5131874 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -753,6 +753,8 @@ static const StreamType REGD_types[] = { { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 }, { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS }, { MKTAG('D', 'R', 'A', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DRA }, + { MKTAG('d', 'v', 'h', 'e'), AVMEDIA_TYPE_VIDEO , AV_CODEC_ID_HEVC}, /* HEVC Dobly vision ES dvhe*/ + { MKTAG('D', 'O', 'V', 'I'), AVMEDIA_TYPE_VIDEO , AV_CODEC_ID_HEVC}, /* HEVC Dobly vision ES dovi*/ { 0 }, }; -- cgit