[FFmpeg-devel] [PATCH] avcodec/h264_parser: export sei recovery frame count as side data
Michael Niedermayer
michaelni at gmx.at
Thu May 15 22:34:18 CEST 2014
TODO: split between API addition and h264 parser change
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
libavcodec/avcodec.h | 13 +++++++++++++
libavcodec/h264_parser.c | 2 ++
libavcodec/parser.c | 1 +
libavformat/utils.c | 6 ++++++
4 files changed, 22 insertions(+)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 9a24c96..ed7b914 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1115,6 +1115,12 @@ enum AVPacketSideDataType {
* side data includes updated metadata which appeared in the stream.
*/
AV_PKT_DATA_METADATA_UPDATE,
+
+ /**
+ * signed LE 32bit integer specifying the number of codec specific units
+ * (frame_num(h264) or POC(HEVC)) until the decoder output is clear of artifacts
+ */
+ AV_PKT_DATA_DECODER_RECOVERY,
};
typedef struct AVPacketSideData {
@@ -4263,6 +4269,13 @@ typedef struct AVCodecParserContext {
* For example, this corresponds to H.264 PicOrderCnt.
*/
int output_picture_number;
+
+ /**
+ * Number of frame_num or POC units until decoding is practically clear of artifacts.
+ * The exact unit depends on the video standard, H.264 stores frame count,
+ * HEVC, POC.
+ */
+ int recovery_frame_cnt;
} AVCodecParserContext;
typedef struct AVCodecParser {
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index ea0ab98..6fa04c8 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -491,6 +491,8 @@ static int h264_parse(AVCodecParserContext *s,
parse_nal_units(s, avctx, buf, buf_size);
+ s->recovery_frame_cnt = h->sei_recovery_frame_cnt;
+
if (h->sei_cpb_removal_delay >= 0) {
s->dts_sync_point = h->sei_buffering_period_present;
s->dts_ref_dts_delta = h->sei_cpb_removal_delay;
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index 3169e25..74525b9 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -84,6 +84,7 @@ found:
s->dts_sync_point = INT_MIN;
s->dts_ref_dts_delta = INT_MIN;
s->pts_dts_delta = INT_MIN;
+ s->recovery_frame_cnt = INT_MIN;
return s;
err_out:
diff --git a/libavformat/utils.c b/libavformat/utils.c
index d84d605..45ce945 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1135,6 +1135,12 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
if (s->flags & AVFMT_FLAG_NOFILLIN)
return;
+ if (pc && pc->recovery_frame_cnt >= 0) {
+ uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_DECODER_RECOVERY, 4);
+ if (side_data)
+ AV_WL32(side_data, pc->recovery_frame_cnt);
+ }
+
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
if (st->last_dts_for_order_check <= pkt->dts) {
--
1.7.9.5
More information about the ffmpeg-devel
mailing list