[FFmpeg-devel] [PATCH] avformat/matroska: Parse generic encryption info from packets.

James Almer jamrial at gmail.com
Tue Aug 14 06:50:49 EEST 2018


On 7/12/2018 8:45 PM, Jacob Trimble wrote:
> I am currently seeing a problem with this when using Opus audio.  In
> read_frame_internal, it will try to parse the resulting packet.  For
> video, which uses subsample encryption, it is able to parse the
> headers; but for Opus, which uses full-sample encryption, it fails to
> parse the headers.  This causes the read_frame_internal to drop the
> packet.
> 
> I have traced a workaround to opus_parse in opus_parser.c: instead of
> setting poutbuf to NULL, set it to the buffer and just pass the packet
> to the app to handle it.  The frame will be decrypted before passing
> to the decoder.  I can't just disable parsing in the demuxer because I
> want to parse the packets for clear content and when using subsample
> encryption.
> 
> Does anyone have any other ideas to work around this?  Is there a way
> to allow parsing but ignore errors?

Try the attached diff to see if it fixes the issue (It makes the parser
not bother trying to assemble packets from what could be incomplete data
if the source is a demuxer that guarantees the propagation of complete
packets).
-------------- next part --------------
diff --git a/libavcodec/opus_parser.c b/libavcodec/opus_parser.c
index 28b0933900..e8d157356c 100644
--- a/libavcodec/opus_parser.c
+++ b/libavcodec/opus_parser.c
@@ -170,6 +170,9 @@ static int opus_parse(AVCodecParserContext *ctx, AVCodecContext *avctx,
     ParseContext *pc    = &s->pc;
     int next, header_len;
 
+    if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) {
+        next = buf_size;
+    } else {
     next = opus_find_frame_end(ctx, avctx, buf, buf_size, &header_len);
 
     if (s->ts_framing && next != AVERROR_INVALIDDATA &&
@@ -184,6 +187,7 @@ static int opus_parse(AVCodecParserContext *ctx, AVCodecContext *avctx,
         *poutbuf_size = 0;
         return buf_size;
     }
+    }
 
     *poutbuf      = buf + header_len;
     *poutbuf_size = buf_size - header_len;


More information about the ffmpeg-devel mailing list