History

lavc/hevcdec: Parse DOVI RPU NALs

And expose the parsed values as frame side data. Update FATE results to match. It's worth documenting that this relies on the dovi configuration record being present on the first AVPacket fed to the decoder, which in practice is the case if if the API user has called something like av_format_inject_global_side_data, which is unfortunately not the default. This commit is not the time and place to change that behavior, though.

Niklas Haas committed 4 years ago

Commit a538df71 parent 08d15184 files · +256 −9Browse files

Unified · Split

4 files
  1. configure +1 −1
  2. libavcodec/hevcdec.c +29 −8
  3. libavcodec/hevcdec.h +2 −0
  4. tests/ref/fate/hevc-dv-rpu +224 −0
configure+1−1
@@ -2826,7 +2826,7 @@ h264_decoder_suggest="error_resilience" · 2825 unmodified lines
2826hap_decoder_select="snappy texturedsp"2826hap_decoder_select="snappy texturedsp"
2827hap_encoder_deps="libsnappy"2827hap_encoder_deps="libsnappy"
2828hap_encoder_select="texturedspenc"2828hap_encoder_select="texturedspenc"
2829hevc_decoder_select="atsc_a53 bswapdsp cabac golomb hevcparse videodsp"2829hevc_decoder_select="atsc_a53 bswapdsp cabac dovi_rpu golomb hevcparse videodsp"
2830huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"2830huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
2831huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"2831huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"
2832hymt_decoder_select="huffyuv_decoder"2832hymt_decoder_select="huffyuv_decoder"
libavcodec/hevcdec.c+29−8
@@ -2723,6 +2723,7 @@ error: · 2722 unmodified lines
2723static int set_side_data(HEVCContext *s)2723static int set_side_data(HEVCContext *s)
2724{2724{
2725 AVFrame *out = s->ref->frame;2725 AVFrame *out = s->ref->frame;
2726 int ret;
2726 2727
2727 if (s->sei.frame_packing.present &&2728 if (s->sei.frame_packing.present &&
2728 s->sei.frame_packing.arrangement_type >= 3 &&2729 s->sei.frame_packing.arrangement_type >= 3 &&
@@ -2977,6 +2978,9 @@ static int set_side_data(HEVCContext *s) · 248 unmodified lines
2977 s->rpu_buf = NULL;2978 s->rpu_buf = NULL;
2978 }2979 }
2979 2980
2981 if ((ret = ff_dovi_attach_side_data(&s->dovi_ctx, out)) < 0)
2982 return ret;
2983
2980 return 0;2984 return 0;
2981}2985}
2982 2986
@@ -3308,16 +3312,23 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) · 325 unmodified lines
3308 if (s->pkt.nb_nals > 1 && s->pkt.nals[s->pkt.nb_nals - 1].type == HEVC_NAL_UNSPEC62 &&3312 if (s->pkt.nb_nals > 1 && s->pkt.nals[s->pkt.nb_nals - 1].type == HEVC_NAL_UNSPEC62 &&
3309 s->pkt.nals[s->pkt.nb_nals - 1].size > 2 && !s->pkt.nals[s->pkt.nb_nals - 1].nuh_layer_id3313 s->pkt.nals[s->pkt.nb_nals - 1].size > 2 && !s->pkt.nals[s->pkt.nb_nals - 1].nuh_layer_id
3310 && !s->pkt.nals[s->pkt.nb_nals - 1].temporal_id) {3314 && !s->pkt.nals[s->pkt.nb_nals - 1].temporal_id) {
3315 H2645NAL *nal = &s->pkt.nals[s->pkt.nb_nals - 1];
3311 if (s->rpu_buf) {3316 if (s->rpu_buf) {
3312 av_buffer_unref(&s->rpu_buf);3317 av_buffer_unref(&s->rpu_buf);
3313 av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");3318 av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3314 }3319 }
3315 3320
3316 s->rpu_buf = av_buffer_alloc(s->pkt.nals[s->pkt.nb_nals - 1].raw_size - 2);3321 s->rpu_buf = av_buffer_alloc(nal->raw_size - 2);
3317 if (!s->rpu_buf)3322 if (!s->rpu_buf)
3318 return AVERROR(ENOMEM);3323 return AVERROR(ENOMEM);
3324 memcpy(s->rpu_buf->data, nal->raw_data + 2, nal->raw_size - 2);
3319 3325
3320 memcpy(s->rpu_buf->data, s->pkt.nals[s->pkt.nb_nals - 1].raw_data + 2, s->pkt.nals[s->pkt.nb_nals - 1].raw_size - 2);3326 ret = ff_dovi_rpu_parse(&s->dovi_ctx, nal->data + 2, nal->size - 2);
3327 if (ret < 0) {
3328 av_buffer_unref(&s->rpu_buf);
3329 av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n");
3330 /* ignore */
3331 }
3321 }3332 }
3322 3333
3323 /* decode the NAL units */3334 /* decode the NAL units */
@@ -3450,8 +3461,8 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, · 126 unmodified lines
3450 AVPacket *avpkt)3461 AVPacket *avpkt)
3451{3462{
3452 int ret;3463 int ret;
3453 size_t new_extradata_size;3464 uint8_t *sd;
3454 uint8_t *new_extradata;3465 size_t sd_size;
3455 HEVCContext *s = avctx->priv_data;3466 HEVCContext *s = avctx->priv_data;
3456 3467
3457 if (!avpkt->size) {3468 if (!avpkt->size) {
@@ -3463,14 +3474,17 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, · 5 unmodified lines
3463 return 0;3474 return 0;
3464 }3475 }
3465 3476
3466 new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,3477 sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, &sd_size);
3467 &new_extradata_size);3478 if (sd && sd_size > 0) {
3468 if (new_extradata && new_extradata_size > 0) {3479 ret = hevc_decode_extradata(s, sd, sd_size, 0);
3469 ret = hevc_decode_extradata(s, new_extradata, new_extradata_size, 0);
3470 if (ret < 0)3480 if (ret < 0)
3471 return ret;3481 return ret;
3472 }3482 }
3473 3483
3484 sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
3485 if (sd && sd_size > 0)
3486 ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd);
3487
3474 s->ref = NULL;3488 s->ref = NULL;
3475 ret = decode_nal_units(s, avpkt->data, avpkt->size);3489 ret = decode_nal_units(s, avpkt->data, avpkt->size);
3476 if (ret < 0)3490 if (ret < 0)
@@ -3563,6 +3577,7 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx) · 86 unmodified lines
3563 3577
3564 pic_arrays_free(s);3578 pic_arrays_free(s);
3565 3579
3580 ff_dovi_ctx_unref(&s->dovi_ctx);
3566 av_buffer_unref(&s->rpu_buf);3581 av_buffer_unref(&s->rpu_buf);
3567 3582
3568 av_freep(&s->md5_ctx);3583 av_freep(&s->md5_ctx);
@@ -3647,6 +3662,7 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) · 78 unmodified lines
3647 3662
3648 ff_bswapdsp_init(&s->bdsp);3663 ff_bswapdsp_init(&s->bdsp);
3649 3664
3665 s->dovi_ctx.logctx = avctx;
3650 s->context_initialized = 1;3666 s->context_initialized = 1;
3651 s->eos = 0;3667 s->eos = 0;
3652 3668
@@ -3755,6 +3771,10 @@ static int hevc_update_thread_context(AVCodecContext *dst, · 102 unmodified lines
3755 if (ret < 0)3771 if (ret < 0)
3756 return ret;3772 return ret;
3757 3773
3774 ret = ff_dovi_ctx_replace(&s->dovi_ctx, &s0->dovi_ctx);
3775 if (ret < 0)
3776 return ret;
3777
3758 s->sei.frame_packing = s0->sei.frame_packing;3778 s->sei.frame_packing = s0->sei.frame_packing;
3759 s->sei.display_orientation = s0->sei.display_orientation;3779 s->sei.display_orientation = s0->sei.display_orientation;
3760 s->sei.mastering_display = s0->sei.mastering_display;3780 s->sei.mastering_display = s0->sei.mastering_display;
@@ -3811,6 +3831,7 @@ static void hevc_decode_flush(AVCodecContext *avctx) · 50 unmodified lines
3811 HEVCContext *s = avctx->priv_data;3831 HEVCContext *s = avctx->priv_data;
3812 ff_hevc_flush_dpb(s);3832 ff_hevc_flush_dpb(s);
3813 ff_hevc_reset_sei(&s->sei);3833 ff_hevc_reset_sei(&s->sei);
3834 ff_dovi_ctx_flush(&s->dovi_ctx);
3814 av_buffer_unref(&s->rpu_buf);3835 av_buffer_unref(&s->rpu_buf);
3815 s->max_ra = INT_MAX;3836 s->max_ra = INT_MAX;
3816 s->eos = 1;3837 s->eos = 1;
libavcodec/hevcdec.h+2−0
@@ -32,6 +32,7 @@ · 31 unmodified lines
32#include "avcodec.h"32#include "avcodec.h"
33#include "bswapdsp.h"33#include "bswapdsp.h"
34#include "cabac.h"34#include "cabac.h"
35#include "dovi_rpu.h"
35#include "get_bits.h"36#include "get_bits.h"
36#include "hevcpred.h"37#include "hevcpred.h"
37#include "h2645_parse.h"38#include "h2645_parse.h"
@@ -574,6 +575,7 @@ typedef struct HEVCContext { · 536 unmodified lines
574 int nuh_layer_id;575 int nuh_layer_id;
575 576
576 AVBufferRef *rpu_buf; ///< 0 or 1 Dolby Vision RPUs.577 AVBufferRef *rpu_buf; ///< 0 or 1 Dolby Vision RPUs.
578 DOVIContext dovi_ctx; ///< Dolby Vision decoding context
577} HEVCContext;579} HEVCContext;
578 580
579/**581/**
tests/ref/fate/hevc-dv-rpu+224−0
@@ -5,9 +5,233 @@ side_data_type=H.26[45] User Data Unregistered SEI message · 4 unmodified lines
5[SIDE_DATA]5[SIDE_DATA]
6side_data_type=Dolby Vision RPU Data6side_data_type=Dolby Vision RPU Data
7[/SIDE_DATA]7[/SIDE_DATA]
8[SIDE_DATA]
9side_data_type=Dolby Vision Metadata
10rpu_type=2
11rpu_format=18
12vdr_rpu_profile=1
13vdr_rpu_level=0
14chroma_resampling_explicit_filter_flag=0
15coef_data_type=0
16coef_log2_denom=23
17vdr_rpu_normalized_idc=1
18bl_video_full_range_flag=0
19bl_bit_depth=10
20el_bit_depth=10
21vdr_bit_depth=12
22spatial_resampling_filter_flag=0
23el_spatial_resampling_filter_flag=0
24disable_residual_flag=1
25vdr_rpu_id=0
26mapping_color_space=0
27mapping_chroma_format_idc=0
28nlq_method_idc=-1
29nlq_method_idc_name=none
30num_x_partitions=1
31num_y_partitions=1
32[COMPONENT]
33pivots=63 132 362 618 874 911 927 935 942
34[SECTION]
35mapping_idc=0
36mapping_idc_name=polynomial
37poly_order=2
38poly_coef=-409680 16721463 -20276640
39[/SECTION]
40[SECTION]
41mapping_idc=0
42mapping_idc_name=polynomial
43poly_order=2
44poly_coef=-119056 13575212 -12867889
45[/SECTION]
46[SECTION]
47mapping_idc=0
48mapping_idc_name=polynomial
49poly_order=2
50poly_coef=1317527 5338528 -948122
51[/SECTION]
52[SECTION]
53mapping_idc=0
54mapping_idc_name=polynomial
55poly_order=2
56poly_coef=2119979 2065496 2288524
57[/SECTION]
58[SECTION]
59mapping_idc=0
60mapping_idc_name=polynomial
61poly_order=2
62poly_coef=7982780 -11367226 9973944
63[/SECTION]
64[SECTION]
65mapping_idc=0
66mapping_idc_name=polynomial
67poly_order=2
68poly_coef=53792084 -114243184 67724328
69[/SECTION]
70[SECTION]
71mapping_idc=0
72mapping_idc_name=polynomial
73poly_order=2
74poly_coef=112973872 -244837568 139764480
75[/SECTION]
76[SECTION]
77mapping_idc=0
78mapping_idc_name=polynomial
79poly_order=2
80poly_coef=236828416 -518849056 291306944
81[/SECTION]
82[/COMPONENT]
83[COMPONENT]
84pivots=0 1023
85[SECTION]
86mapping_idc=1
87mapping_idc_name=mmr
88mmr_order=3
89mmr_constant=-4200453
90mmr_coef=9094176 31944476 739652 -27103344 -3431599 -11015088 22758042 -2028643 -30021218 -906885 26272992 7291404 16488745 -78087176 -1487777 12496543 762460 -4281948 -5768035 -7843163 103636960
91[/SECTION]
92[/COMPONENT]
93[COMPONENT]
94pivots=0 1023
95[SECTION]
96mapping_idc=1
97mapping_idc_name=mmr
98mmr_order=3
99mmr_constant=-10387889
100mmr_coef=29604202 3214133 46206184 -8564340 -53383996 1628407 5426045 -21634202 -5251953 -50812292 19221972 76726656 -425892 -35041240 5917361 2863974 25030554 -14404292 -41230120 1229046 53575140
101[/SECTION]
102[/COMPONENT]
103dm_metadata_id=0
104scene_refresh_flag=1
105ycc_to_rgb_matrix=9574/8192 0/8192 13802/8192 9574/8192 -1540/8192 -5348/8192 9574/8192 17610/8192 0/8192
106ycc_to_rgb_offset=16777216/268435456 134217728/268435456 134217728/268435456
107rgb_to_lms_matrix=7222/16384 8771/16384 390/16384 2654/16384 12430/16384 1300/16384 0/16384 422/16384 15962/16384
108signal_eotf=65535
109signal_eotf_param0=0
110signal_eotf_param1=0
111signal_eotf_param2=0
112signal_bit_depth=12
113signal_color_space=0
114signal_chroma_format=0
115signal_full_range_flag=1
116source_min_pq=0
117source_max_pq=3079
118source_diagonal=42
119[/SIDE_DATA]
8[/FRAME]120[/FRAME]
9[FRAME]121[FRAME]
10[SIDE_DATA]122[SIDE_DATA]
11side_data_type=Dolby Vision RPU Data123side_data_type=Dolby Vision RPU Data
12[/SIDE_DATA]124[/SIDE_DATA]
125[SIDE_DATA]
126side_data_type=Dolby Vision Metadata
127rpu_type=2
128rpu_format=18
129vdr_rpu_profile=1
130vdr_rpu_level=0
131chroma_resampling_explicit_filter_flag=0
132coef_data_type=0
133coef_log2_denom=23
134vdr_rpu_normalized_idc=1
135bl_video_full_range_flag=0
136bl_bit_depth=10
137el_bit_depth=10
138vdr_bit_depth=12
139spatial_resampling_filter_flag=0
140el_spatial_resampling_filter_flag=0
141disable_residual_flag=1
142vdr_rpu_id=0
143mapping_color_space=0
144mapping_chroma_format_idc=0
145nlq_method_idc=-1
146nlq_method_idc_name=none
147num_x_partitions=1
148num_y_partitions=1
149[COMPONENT]
150pivots=63 132 362 618 874 911 927 935 942
151[SECTION]
152mapping_idc=0
153mapping_idc_name=polynomial
154poly_order=2
155poly_coef=-409680 16721463 -20276640
156[/SECTION]
157[SECTION]
158mapping_idc=0
159mapping_idc_name=polynomial
160poly_order=2
161poly_coef=-119056 13575212 -12867889
162[/SECTION]
163[SECTION]
164mapping_idc=0
165mapping_idc_name=polynomial
166poly_order=2
167poly_coef=1317527 5338528 -948122
168[/SECTION]
169[SECTION]
170mapping_idc=0
171mapping_idc_name=polynomial
172poly_order=2
173poly_coef=2119979 2065496 2288524
174[/SECTION]
175[SECTION]
176mapping_idc=0
177mapping_idc_name=polynomial
178poly_order=2
179poly_coef=7982780 -11367226 9973944
180[/SECTION]
181[SECTION]
182mapping_idc=0
183mapping_idc_name=polynomial
184poly_order=2
185poly_coef=53792084 -114243184 67724328
186[/SECTION]
187[SECTION]
188mapping_idc=0
189mapping_idc_name=polynomial
190poly_order=2
191poly_coef=112973872 -244837568 139764480
192[/SECTION]
193[SECTION]
194mapping_idc=0
195mapping_idc_name=polynomial
196poly_order=2
197poly_coef=236828416 -518849056 291306944
198[/SECTION]
199[/COMPONENT]
200[COMPONENT]
201pivots=0 1023
202[SECTION]
203mapping_idc=1
204mapping_idc_name=mmr
205mmr_order=3
206mmr_constant=-4200453
207mmr_coef=9094176 31944476 739652 -27103344 -3431599 -11015088 22758042 -2028643 -30021218 -906885 26272992 7291404 16488745 -78087176 -1487777 12496543 762460 -4281948 -5768035 -7843163 103636960
208[/SECTION]
209[/COMPONENT]
210[COMPONENT]
211pivots=0 1023
212[SECTION]
213mapping_idc=1
214mapping_idc_name=mmr
215mmr_order=3
216mmr_constant=-10387889
217mmr_coef=29604202 3214133 46206184 -8564340 -53383996 1628407 5426045 -21634202 -5251953 -50812292 19221972 76726656 -425892 -35041240 5917361 2863974 25030554 -14404292 -41230120 1229046 53575140
218[/SECTION]
219[/COMPONENT]
220dm_metadata_id=0
221scene_refresh_flag=1
222ycc_to_rgb_matrix=9574/8192 0/8192 13802/8192 9574/8192 -1540/8192 -5348/8192 9574/8192 17610/8192 0/8192
223ycc_to_rgb_offset=16777216/268435456 134217728/268435456 134217728/268435456
224rgb_to_lms_matrix=7222/16384 8771/16384 390/16384 2654/16384 12430/16384 1300/16384 0/16384 422/16384 15962/16384
225signal_eotf=65535
226signal_eotf_param0=0
227signal_eotf_param1=0
228signal_eotf_param2=0
229signal_bit_depth=12
230signal_color_space=0
231signal_chroma_format=0
232signal_full_range_flag=1
233source_min_pq=0
234source_max_pq=3079
235source_diagonal=42
236[/SIDE_DATA]
13[/FRAME]237[/FRAME]

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t