3 * Copyright (c) 2012 Michael Niedermayer
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #define BITSTREAM_READER_LE
28 #include "bitstream.h"
32 typedef struct TAKParseContext
{
38 static av_cold
int tak_init(AVCodecParserContext
*s
)
44 static int tak_parse(AVCodecParserContext
*s
, AVCodecContext
*avctx
,
45 const uint8_t **poutbuf
, int *poutbuf_size
,
46 const uint8_t *buf
, int buf_size
)
48 TAKParseContext
*t
= s
->priv_data
;
49 ParseContext
*pc
= &t
->pc
;
50 int next
= END_NOT_FOUND
;
53 int needed
= buf_size
? TAK_MAX_FRAME_HEADER_BYTES
: 8;
55 if (s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
57 bitstream_init(&bc
, buf
, buf_size
);
58 if (!ff_tak_decode_frame_header(avctx
, &bc
, &ti
, 127))
59 s
->duration
= t
->ti
.last_frame_samples
? t
->ti
.last_frame_samples
60 : t
->ti
.frame_samples
;
62 *poutbuf_size
= buf_size
;
66 while (buf_size
|| t
->index
+ needed
<= pc
->index
) {
67 if (buf_size
&& t
->index
+ TAK_MAX_FRAME_HEADER_BYTES
> pc
->index
) {
68 int tmp_buf_size
= FFMIN(2 * TAK_MAX_FRAME_HEADER_BYTES
,
70 const uint8_t *tmp_buf
= buf
;
72 ff_combine_frame(pc
, END_NOT_FOUND
, &tmp_buf
, &tmp_buf_size
);
73 consumed
+= tmp_buf_size
;
75 buf_size
-= tmp_buf_size
;
78 for (; t
->index
+ needed
<= pc
->index
; t
->index
++)
79 if (pc
->buffer
[t
->index
] == 0xFF &&
80 pc
->buffer
[t
->index
+ 1] == 0xA0) {
83 bitstream_init8(&bc
, pc
->buffer
+ t
->index
,
84 pc
->index
- t
->index
);
85 if (!ff_tak_decode_frame_header(avctx
, &bc
,
86 pc
->frame_start_found
? &ti
89 !ff_tak_check_crc(pc
->buffer
+ t
->index
,
90 bitstream_tell(&bc
) / 8)) {
91 if (!pc
->frame_start_found
) {
92 pc
->frame_start_found
= 1;
93 s
->duration
= t
->ti
.last_frame_samples
?
94 t
->ti
.last_frame_samples
:
97 pc
->frame_start_found
= 0;
98 next
= t
->index
- pc
->index
;
107 if (consumed
&& !buf_size
&& next
== END_NOT_FOUND
||
108 ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
111 return buf_size
+ consumed
;
114 if (next
!= END_NOT_FOUND
) {
116 pc
->overread
= FFMAX(0, -next
);
120 *poutbuf_size
= buf_size
;
124 AVCodecParser ff_tak_parser
= {
125 .codec_ids
= { AV_CODEC_ID_TAK
},
126 .priv_data_size
= sizeof(TAKParseContext
),
127 .parser_init
= tak_init
,
128 .parser_parse
= tak_parse
,
129 .parser_close
= ff_parse_close
,