Re: [FFmpeg-devel] [PATCH v2 2/4] avcodec/hevcdec: create AVFrame side data from HEVC timecodes like H.264
On Tue, Jun 23, 2020 at 10:18:55PM +0100, Josh de Kock wrote: > On 17/06/2020 17:07, lance.lmw...@gmail.com wrote: > > From: Limin Wang > > > > Signed-off-by: Limin Wang > > --- > > libavcodec/hevcdec.c | 44 > > 1 file changed, 44 insertions(+) > > > > diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c > > index c9e28f5..39abbb9 100644 > > --- a/libavcodec/hevcdec.c > > +++ b/libavcodec/hevcdec.c > > @@ -2808,6 +2808,50 @@ static int set_side_data(HEVCContext *s) > > } > > s->sei.unregistered.nb_buf_ref = 0; > > +if (s->sei.timecode.present) { > > +uint32_t tc = 0; > > +uint32_t *tc_sd; > > +AVFrameSideData *tcside = av_frame_new_side_data(out, > > AV_FRAME_DATA_S12M_TIMECODE, > > + sizeof(uint32_t) > > * 4); > > +if (!tcside) > > +return AVERROR(ENOMEM); > > + > > +tc_sd = (uint32_t*)tcside->data; > > +tc_sd[0] = s->sei.timecode.num_clock_ts; > > + > > +for (int i = 0; i < tc_sd[0]; i++) { > > +uint32_t frames; > > + > > +/* For SMPTE 12-M timecodes, frame count is a special case if > > > 30 FPS. > > + See SMPTE ST 12-1:2014 Sec 12.1 for more info. */ > > +if (av_cmp_q(s->avctx->framerate, (AVRational) {30, 1}) == 1) { > > +frames = s->sei.timecode.n_frames[i] / 2; > > +if (s->sei.timecode.n_frames[i] % 2 == 1) { > > +if (av_cmp_q(s->avctx->framerate, (AVRational) {50, > > 1}) == 0) > > +tc |= (1 << 7); > > +else > > +tc |= (1 << 23); > > +} > > +} else { > > +frames = s->sei.timecode.n_frames[i]; > > +} > > + > > +tc |= s->sei.timecode.cnt_dropped_flag[i] << 30; > > +tc |= (frames / 10) << 28; > > +tc |= (frames % 10) << 24; > > +tc |= (s->sei.timecode.seconds_value[i] / 10) << 20; > > +tc |= (s->sei.timecode.seconds_value[i] % 10) << 16; > > +tc |= (s->sei.timecode.minutes_value[i] / 10) << 12; > > +tc |= (s->sei.timecode.minutes_value[i] % 10) << 8; > > +tc |= (s->sei.timecode.hours_value[i] / 10) << 4; > > +tc |= (s->sei.timecode.hours_value[i] % 10); > > + > > +tc_sd[i + 1] = tc; > > +} > > + > > +s->sei.timecode.num_clock_ts = 0; > > +} > > + > > return 0; > > } > > > > As you said in the commit message, h264 already does this so it would be > nice if you didn't duplicate the code. Split both parts of s12m decoding > you've copied into a common h2645 or just an s12m file maybe? I have updated the patchset to remove the code duplication, please help to review whether it's OK for you, thx. > > -- > Josh > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". -- Thanks, Limin Wang ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH v2 2/4] avcodec/hevcdec: create AVFrame side data from HEVC timecodes like H.264
On Tue, Jun 23, 2020 at 10:18:55PM +0100, Josh de Kock wrote: > On 17/06/2020 17:07, lance.lmw...@gmail.com wrote: > > From: Limin Wang > > > > Signed-off-by: Limin Wang > > --- > > libavcodec/hevcdec.c | 44 > > 1 file changed, 44 insertions(+) > > > > diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c > > index c9e28f5..39abbb9 100644 > > --- a/libavcodec/hevcdec.c > > +++ b/libavcodec/hevcdec.c > > @@ -2808,6 +2808,50 @@ static int set_side_data(HEVCContext *s) > > } > > s->sei.unregistered.nb_buf_ref = 0; > > +if (s->sei.timecode.present) { > > +uint32_t tc = 0; > > +uint32_t *tc_sd; > > +AVFrameSideData *tcside = av_frame_new_side_data(out, > > AV_FRAME_DATA_S12M_TIMECODE, > > + sizeof(uint32_t) > > * 4); > > +if (!tcside) > > +return AVERROR(ENOMEM); > > + > > +tc_sd = (uint32_t*)tcside->data; > > +tc_sd[0] = s->sei.timecode.num_clock_ts; > > + > > +for (int i = 0; i < tc_sd[0]; i++) { > > +uint32_t frames; > > + > > +/* For SMPTE 12-M timecodes, frame count is a special case if > > > 30 FPS. > > + See SMPTE ST 12-1:2014 Sec 12.1 for more info. */ > > +if (av_cmp_q(s->avctx->framerate, (AVRational) {30, 1}) == 1) { > > +frames = s->sei.timecode.n_frames[i] / 2; > > +if (s->sei.timecode.n_frames[i] % 2 == 1) { > > +if (av_cmp_q(s->avctx->framerate, (AVRational) {50, > > 1}) == 0) > > +tc |= (1 << 7); > > +else > > +tc |= (1 << 23); > > +} > > +} else { > > +frames = s->sei.timecode.n_frames[i]; > > +} > > + > > +tc |= s->sei.timecode.cnt_dropped_flag[i] << 30; > > +tc |= (frames / 10) << 28; > > +tc |= (frames % 10) << 24; > > +tc |= (s->sei.timecode.seconds_value[i] / 10) << 20; > > +tc |= (s->sei.timecode.seconds_value[i] % 10) << 16; > > +tc |= (s->sei.timecode.minutes_value[i] / 10) << 12; > > +tc |= (s->sei.timecode.minutes_value[i] % 10) << 8; > > +tc |= (s->sei.timecode.hours_value[i] / 10) << 4; > > +tc |= (s->sei.timecode.hours_value[i] % 10); > > + > > +tc_sd[i + 1] = tc; > > +} > > + > > +s->sei.timecode.num_clock_ts = 0; > > +} > > + > > return 0; > > } > > > > As you said in the commit message, h264 already does this so it would be > nice if you didn't duplicate the code. Split both parts of s12m decoding > you've copied into a common h2645 or just an s12m file maybe? Good points, I have considered it and plan to do after the patchset and add fate case, then remove the duplicate code to make sure no break case. I'll add a new function in timecode.h to get tc: uint32_t av_timecode_get_smpte(tc, fps, drop, ff, ss, mm, hh); and av_timecode_get_smpte_from_framenum() will use the function to avoid duplicate code to get smpte. one question is the bit7 and bit23 isn't set by av_timecode_get_smpte_from_framenum() yet, I'm not sure whether it'll break any other code if I'll add to the current code. > > -- > Josh > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". -- Thanks, Limin Wang ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH v2 2/4] avcodec/hevcdec: create AVFrame side data from HEVC timecodes like H.264
On 17/06/2020 17:07, lance.lmw...@gmail.com wrote: From: Limin Wang Signed-off-by: Limin Wang --- libavcodec/hevcdec.c | 44 1 file changed, 44 insertions(+) diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index c9e28f5..39abbb9 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -2808,6 +2808,50 @@ static int set_side_data(HEVCContext *s) } s->sei.unregistered.nb_buf_ref = 0; +if (s->sei.timecode.present) { +uint32_t tc = 0; +uint32_t *tc_sd; +AVFrameSideData *tcside = av_frame_new_side_data(out, AV_FRAME_DATA_S12M_TIMECODE, + sizeof(uint32_t) * 4); +if (!tcside) +return AVERROR(ENOMEM); + +tc_sd = (uint32_t*)tcside->data; +tc_sd[0] = s->sei.timecode.num_clock_ts; + +for (int i = 0; i < tc_sd[0]; i++) { +uint32_t frames; + +/* For SMPTE 12-M timecodes, frame count is a special case if > 30 FPS. + See SMPTE ST 12-1:2014 Sec 12.1 for more info. */ +if (av_cmp_q(s->avctx->framerate, (AVRational) {30, 1}) == 1) { +frames = s->sei.timecode.n_frames[i] / 2; +if (s->sei.timecode.n_frames[i] % 2 == 1) { +if (av_cmp_q(s->avctx->framerate, (AVRational) {50, 1}) == 0) +tc |= (1 << 7); +else +tc |= (1 << 23); +} +} else { +frames = s->sei.timecode.n_frames[i]; +} + +tc |= s->sei.timecode.cnt_dropped_flag[i] << 30; +tc |= (frames / 10) << 28; +tc |= (frames % 10) << 24; +tc |= (s->sei.timecode.seconds_value[i] / 10) << 20; +tc |= (s->sei.timecode.seconds_value[i] % 10) << 16; +tc |= (s->sei.timecode.minutes_value[i] / 10) << 12; +tc |= (s->sei.timecode.minutes_value[i] % 10) << 8; +tc |= (s->sei.timecode.hours_value[i] / 10) << 4; +tc |= (s->sei.timecode.hours_value[i] % 10); + +tc_sd[i + 1] = tc; +} + +s->sei.timecode.num_clock_ts = 0; +} + return 0; } As you said in the commit message, h264 already does this so it would be nice if you didn't duplicate the code. Split both parts of s12m decoding you've copied into a common h2645 or just an s12m file maybe? -- Josh ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH v2 2/4] avcodec/hevcdec: create AVFrame side data from HEVC timecodes like H.264
From: Limin Wang Signed-off-by: Limin Wang --- libavcodec/hevcdec.c | 44 1 file changed, 44 insertions(+) diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index c9e28f5..39abbb9 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -2808,6 +2808,50 @@ static int set_side_data(HEVCContext *s) } s->sei.unregistered.nb_buf_ref = 0; +if (s->sei.timecode.present) { +uint32_t tc = 0; +uint32_t *tc_sd; +AVFrameSideData *tcside = av_frame_new_side_data(out, AV_FRAME_DATA_S12M_TIMECODE, + sizeof(uint32_t) * 4); +if (!tcside) +return AVERROR(ENOMEM); + +tc_sd = (uint32_t*)tcside->data; +tc_sd[0] = s->sei.timecode.num_clock_ts; + +for (int i = 0; i < tc_sd[0]; i++) { +uint32_t frames; + +/* For SMPTE 12-M timecodes, frame count is a special case if > 30 FPS. + See SMPTE ST 12-1:2014 Sec 12.1 for more info. */ +if (av_cmp_q(s->avctx->framerate, (AVRational) {30, 1}) == 1) { +frames = s->sei.timecode.n_frames[i] / 2; +if (s->sei.timecode.n_frames[i] % 2 == 1) { +if (av_cmp_q(s->avctx->framerate, (AVRational) {50, 1}) == 0) +tc |= (1 << 7); +else +tc |= (1 << 23); +} +} else { +frames = s->sei.timecode.n_frames[i]; +} + +tc |= s->sei.timecode.cnt_dropped_flag[i] << 30; +tc |= (frames / 10) << 28; +tc |= (frames % 10) << 24; +tc |= (s->sei.timecode.seconds_value[i] / 10) << 20; +tc |= (s->sei.timecode.seconds_value[i] % 10) << 16; +tc |= (s->sei.timecode.minutes_value[i] / 10) << 12; +tc |= (s->sei.timecode.minutes_value[i] % 10) << 8; +tc |= (s->sei.timecode.hours_value[i] / 10) << 4; +tc |= (s->sei.timecode.hours_value[i] % 10); + +tc_sd[i + 1] = tc; +} + +s->sei.timecode.num_clock_ts = 0; +} + return 0; } -- 1.8.3.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".