[FFmpeg-devel] [PATCH] lavf/ogg: Support for end trimming Opus

Vignesh Venkatasubramanian vigneshv at google.com
Thu Sep 12 19:24:18 CEST 2013


Adding support for end trimming Opus embedded in Ogg container.

Signed-Off By: Vignesh Venkatasubramanian <vigneshv at google.com>
---
 libavformat/oggdec.c       | 13 +++++++++++++
 libavformat/oggdec.h       |  1 +
 libavformat/oggparseopus.c |  1 +
 3 files changed, 15 insertions(+)

diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 9c560a8..9f8d665 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -30,6 +30,7 @@
 
 #include <stdio.h>
 #include "libavutil/avassert.h"
+#include "libavutil/intreadwrite.h"
 #include "oggdec.h"
 #include "avformat.h"
 #include "internal.h"
@@ -773,6 +774,18 @@ retry:
     pkt->duration = os->pduration;
     pkt->pos      = fpos;
 
+    if (os->end_trimming) {
+        uint8_t *side_data = av_packet_new_side_data(pkt,
+                                                     AV_PKT_DATA_SKIP_SAMPLES,
+                                                     10);
+        if(side_data == NULL) {
+            av_free_packet(pkt);
+            av_free(pkt);
+            return AVERROR(ENOMEM);
+        }
+        AV_WL32(side_data + 4, os->end_trimming);
+    }
+
     return psize;
 }
 
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index e9a300d..c31859f 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -84,6 +84,7 @@ struct ogg_stream {
     int got_start;
     int got_data;   ///< 1 if the stream got some data (non-initial packets), 0 otherwise
     int nb_header; ///< set to the number of parsed headers
+    int end_trimming; ///< set the number of packets to drop from the end
     void *private;
 };
 
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index 0e8f1ca..8e53860 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -118,6 +118,7 @@ static int opus_packet(AVFormatContext *avf, int idx)
         skip = FFMIN(skip, os->pduration);
         if (skip > 0) {
             os->pduration = skip < os->pduration ? os->pduration - skip : 1;
+            os->end_trimming = skip;
             av_log(avf, AV_LOG_WARNING,
                    "Last packet must be truncated to %d (unimplemented).\n",
                    os->pduration);
-- 
1.8.4



More information about the ffmpeg-devel mailing list