Because not every side data is handled or extracted
internally by libav, a libavcodec user might need
to attach some extradata and retrieve it in
presentation order after decoding.

Ex: active format data,
    unhandled closed captions format
---
 libavcodec/avcodec.h      | 7 +++++++
 libavcodec/utils.c        | 1 +
 libavfilter/vf_showinfo.c | 3 +++
 libavformat/dump.c        | 3 +++
 libavutil/frame.h         | 8 ++++++++
 5 files changed, 22 insertions(+)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 167525d..8e5408b 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1289,6 +1289,13 @@ enum AVPacketSideDataType {
      * This side data corresponds to the AVCPBProperties struct.
      */
     AV_PKT_DATA_CPB_PROPERTIES,
+
+    /**
+     * This side data format is free to the user.
+     * It will be accessible through AV_FRAME_DATA_CUSTOM on
+     * a corresponding frame in presentation order after decoding.
+     */
+    AV_PKT_DATA_CUSTOM,
 };
 
 typedef struct AVPacketSideData {
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 837edbd..fd05d17 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -543,6 +543,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame 
*frame)
         { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX },
         { AV_PKT_DATA_STEREO3D,      AV_FRAME_DATA_STEREO3D },
         { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
+        { AV_PKT_DATA_CUSTOM,        AV_FRAME_DATA_CUSTOM },
     };
 
     frame->color_primaries = avctx->color_primaries;
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index 204ff7a..4bdb3ca 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -127,6 +127,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame 
*frame)
         case AV_FRAME_DATA_AFD:
             av_log(ctx, AV_LOG_INFO, "afd: value of %"PRIu8, sd->data[0]);
             break;
+        case AV_FRAME_DATA_CUSTOM:
+            av_log(ctx, AV_LOG_INFO, "custom unknown side data");
+            break;
         default:
             av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d bytes)",
                    sd->type, sd->size);
diff --git a/libavformat/dump.c b/libavformat/dump.c
index 3b50f5d..9891c4c 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -354,6 +354,9 @@ static void dump_sidedata(void *ctx, AVStream *st, const 
char *indent)
             av_log(ctx, AV_LOG_INFO, "cpb: ");
             dump_cpb(ctx, &sd);
             break;
+        case AV_PKT_DATA_CUSTOM:
+            av_log(ctx, AV_LOG_INFO, "custom unknown side data");
+            break;
         default:
             av_log(ctx, AV_LOG_WARNING,
                    "unknown side data type %d (%d bytes)", sd.type, sd.size);
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 12624d7..f6a365e 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -92,6 +92,14 @@ enum AVFrameSideDataType {
      * enum AVAudioServiceType defined in avcodec.h.
      */
     AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
+
+    /**
+     * This side data corresponds to the custom/private data passed to the 
decoder
+     * through AV_PKT_DATA_CUSTOM. It allows to stick custom data to a 
compressed
+     * frame and receive it in presentation order after decoding.
+     * It is not used by the library itself.
+     */
+    AV_FRAME_DATA_CUSTOM,
 };
 
 enum AVActiveFormatDescription {
-- 
2.7.4

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to