[FFmpeg-cvslog] avcodec/dca_parser: skip initial padding
foo86
git at videolan.org
Tue May 31 16:46:53 CEST 2016
ffmpeg | branch: master | foo86 <foobaz86 at gmail.com> | Tue May 31 14:46:14 2016 +0300| [214e63f8511330e8da8d69b5ea402ff0a4f17316] | committer: James Almer
avcodec/dca_parser: skip initial padding
Padding before the first sync word can be very large for DTS-in-WAV
streams. There is no reason to include this padding in parsed packet.
Signed-off-by: James Almer <jamrial at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=214e63f8511330e8da8d69b5ea402ff0a4f17316
---
libavcodec/dca_parser.c | 41 ++++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/libavcodec/dca_parser.c b/libavcodec/dca_parser.c
index 1521a5b..e5bea33 100644
--- a/libavcodec/dca_parser.c
+++ b/libavcodec/dca_parser.c
@@ -33,6 +33,7 @@ typedef struct DCAParseContext {
uint32_t lastmarker;
int size;
int framesize;
+ unsigned int startpos;
DCAExssParser exss;
unsigned int sr_code;
} DCAParseContext;
@@ -75,20 +76,27 @@ static int dca_find_frame_end(DCAParseContext *pc1, const uint8_t *buf,
i = 0;
if (!start_found) {
- for (i = 0; i < buf_size; i++) {
+ for (; i < buf_size; i++) {
+ size++;
state = (state << 8) | buf[i];
- if (IS_MARKER(state)) {
- if (!pc1->lastmarker ||
- pc1->lastmarker == CORE_MARKER(state) ||
- pc1->lastmarker == DCA_SYNCWORD_SUBSTREAM) {
- start_found = 1;
- if (IS_EXSS_MARKER(state))
- pc1->lastmarker = EXSS_MARKER(state);
- else
- pc1->lastmarker = CORE_MARKER(state);
- i++;
- break;
- }
+
+ if (IS_MARKER(state) &&
+ (!pc1->lastmarker ||
+ pc1->lastmarker == CORE_MARKER(state) ||
+ pc1->lastmarker == DCA_SYNCWORD_SUBSTREAM)) {
+ if (!pc1->lastmarker)
+ pc1->startpos = IS_EXSS_MARKER(state) ? size - 4 : size - 6;
+
+ if (IS_EXSS_MARKER(state))
+ pc1->lastmarker = EXSS_MARKER(state);
+ else
+ pc1->lastmarker = CORE_MARKER(state);
+
+ start_found = 1;
+ size = 0;
+
+ i++;
+ break;
}
}
}
@@ -284,6 +292,13 @@ static int dca_parse(AVCodecParserContext *s, AVCodecContext *avctx,
*poutbuf_size = 0;
return buf_size;
}
+
+ /* skip initial padding */
+ if (buf_size > pc1->startpos) {
+ buf += pc1->startpos;
+ buf_size -= pc1->startpos;
+ }
+ pc1->startpos = 0;
}
/* read the duration and sample rate from the frame header */
More information about the ffmpeg-cvslog
mailing list