[FFmpeg-devel] [PATCH 06/21] libavcodec/avcodec.h: AV_CODEC_ID_META added for timed meta data

erkki.seppala.ext at nokia.com erkki.seppala.ext at nokia.com
Tue Aug 23 12:03:24 EEST 2016


From: Erkki Seppälä <erkki.seppala.ext at nokia.com>

This basically passes the data forward and is used for referring timed
meta data tracks by a codec.

Signed-off-by: Erkki Seppälä <erkki.seppala.ext at nokia.com>
Signed-off-by: OZOPlayer <OZOPL at nokia.com>
---
 libavcodec/avcodec.h   |  2 +-
 libavcodec/metacodec.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 95 insertions(+), 1 deletion(-)
 create mode 100644 libavcodec/metacodec.c

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index fb8f363..756eda5 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -639,7 +639,7 @@ enum AVCodecID {
     AV_CODEC_ID_DVD_NAV,
     AV_CODEC_ID_TIMED_ID3,
     AV_CODEC_ID_BIN_DATA,
-
+    AV_CODEC_ID_META,
 
     AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
 
diff --git a/libavcodec/metacodec.c b/libavcodec/metacodec.c
new file mode 100644
index 0000000..f26a0d0
--- /dev/null
+++ b/libavcodec/metacodec.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2015 Erkki Seppälä <erkki.seppala.ext at nokia.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "internal.h"
+#include "libavutil/opt.h"
+#include "libavformat/avio.h"
+
+static av_cold int meta_init(AVCodecContext *avctx)
+{
+    return 0;
+}
+
+static av_cold int meta_encode(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+                               int *got_packet_ptr)
+{
+    int ret;
+
+    *got_packet_ptr = 0;
+
+    if ((ret = ff_alloc_packet2(avctx, avpkt, frame->nb_samples, 0)) < 0)
+        return ret;
+    memcpy(avpkt->data, frame->data[0], frame->nb_samples);
+    avpkt->size = frame->nb_samples;
+    avpkt->pts = frame->pts;
+    avpkt->dts = frame->pts;
+    *got_packet_ptr = 1;
+
+    return 0;
+}
+
+static int meta_decode(AVCodecContext *avctx, void *data, int *got_packet_ptr, AVPacket *avpkt)
+{
+    AVData *metadata = data;
+
+    *got_packet_ptr = 0;
+
+    av_buffer_unref(&metadata->data);
+    metadata->data = av_buffer_alloc(avpkt->size);
+    if (!metadata->data)
+        return AVERROR(ENOMEM);
+
+    metadata->dts = avpkt->dts;
+    metadata->pts = avpkt->pts;
+    memcpy(((char*) metadata->data->data), avpkt->data, avpkt->size);
+    *got_packet_ptr = 1;
+
+    return 0;
+}
+
+static const AVClass metacodec_class = {
+    .class_name = "Meta data codec",
+    .item_name  = av_default_item_name,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_meta_encoder = {
+    .name           = "meta",
+    .long_name      = NULL_IF_CONFIG_SMALL("Meta Data Encoder"),
+    .type           = AVMEDIA_TYPE_DATA,
+    .id             = AV_CODEC_ID_META,
+    .init           = meta_init,
+    .encode2        = meta_encode,
+    .priv_class     = &metacodec_class,
+    .priv_data_size = 0,
+};
+
+AVCodec ff_meta_decoder = {
+    .name           = "meta",
+    .long_name      = NULL_IF_CONFIG_SMALL("Meta Data Decoder"),
+    .type           = AVMEDIA_TYPE_DATA,
+    .id             = AV_CODEC_ID_META,
+    .init           = meta_init,
+    .decode         = meta_decode,
+    .priv_class     = &metacodec_class,
+    .priv_data_size = 0,
+};
-- 
2.7.4



More information about the ffmpeg-devel mailing list