Thanks for pointing out the use of private API. It seemed that this would have needed to add a new function for the API for decoding timed metadata frames, but probably a better solution is to use the avcodec_receive_packet framework for this as the old API is deprecated anyway?

Below is a patch to introduce the functionality (example edited for brevity). If this seems like the way to, I'll add this to v2 of the patches. (I may squash the first patch with one of the other patches if it fits in.)

commit ddfb745109768a169e93c221092161d39c8f8208
Author: Erkki Seppälä <erkki.seppala....@nokia.com>
Date:   Thu Aug 25 10:21:15 2016 +0300

    libavcodec/utils: do_decode now supports AVMEDIA_TYPE_DATA

This allows using avcodec_send_packet with data frames (ie. timed metadata)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 138125a..8b55464 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2737,6 +2737,10 @@ static int do_decode(AVCodecContext *avctx, AVPacket *pkt)
     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
         ret = avcodec_decode_audio4(avctx, avctx->internal->buffer_frame,
                                     &got_frame, pkt);
+    } else if (avctx->codec_type == AVMEDIA_TYPE_DATA) {
+ ret = avctx->codec->decode(avctx, avctx->internal->buffer_frame, &got_frame, pkt);
+        if (ret == 0 && got_frame)
+            ret = pkt->size;
     } else {
         ret = AVERROR(EINVAL);
     }

commit ebfceb706d8c8d0dbfe64ebe06d218aaa8807e43
Author: Erkki Seppälä <erkki.seppala....@nokia.com>
Date:   Thu Aug 25 10:22:19 2016 +0300

fixup! doc/examples/extract_timed_metadata: added a bare-bones metadata extractor; find only the frames

diff --git a/doc/examples/extract_timed_metadata.c b/doc/examples/extract_timed_metadata.c
index 48fb877..03da2b7 100644
--- a/doc/examples/extract_timed_metadata.c
+++ b/doc/examples/extract_timed_metadata.c
@@ -184,16 +183,15 @@ int main(int argc, char **argv)

         for (i = 0; metadata_stream_indices[i] >= 0; i++) {
             if (packet.stream_index == metadata_stream_indices[i]) {
-                got_frame = 0;
-
- ret = dec_ctx[i]->codec->decode(dec_ctx[i], metadata, &got_frame, &packet);
+                ret = avcodec_send_packet(dec_ctx[i], &packet);

+ // We always empty decoded frames so we don't handle AVERROR(EAGAIN) here
                 if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error decoding meta data\n");
                     break;
                 }

-                if (got_frame) {
+                while (avcodec_receive_frame(dec_ctx[i], metadata) == 0) {
                     int c;
                     printf("track #%d at %" PRId64 " %d, ",
                            packet.stream_index + 1,
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to