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
30 typedef struct TAKParseContext
{
36 static av_cold
int tak_init(AVCodecParserContext
*s
)
42 static int tak_parse(AVCodecParserContext
*s
, AVCodecContext
*avctx
,
43 const uint8_t **poutbuf
, int *poutbuf_size
,
44 const uint8_t *buf
, int buf_size
)
46 TAKParseContext
*t
= s
->priv_data
;
47 ParseContext
*pc
= &t
->pc
;
48 int next
= END_NOT_FOUND
;
51 int needed
= buf_size
? TAK_MAX_FRAME_HEADER_BYTES
: 8;
53 if (s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
55 init_get_bits(&gb
, buf
, buf_size
);
56 if (!ff_tak_decode_frame_header(avctx
, &gb
, &ti
, 127))
57 s
->duration
= t
->ti
.last_frame_samples
? t
->ti
.last_frame_samples
58 : t
->ti
.frame_samples
;
60 *poutbuf_size
= buf_size
;
64 while (buf_size
|| t
->index
+ needed
<= pc
->index
) {
65 if (buf_size
&& t
->index
+ TAK_MAX_FRAME_HEADER_BYTES
> pc
->index
) {
66 int tmp_buf_size
= FFMIN(2 * TAK_MAX_FRAME_HEADER_BYTES
,
68 const uint8_t *tmp_buf
= buf
;
70 ff_combine_frame(pc
, END_NOT_FOUND
, &tmp_buf
, &tmp_buf_size
);
71 consumed
+= tmp_buf_size
;
73 buf_size
-= tmp_buf_size
;
76 for (; t
->index
+ needed
<= pc
->index
; t
->index
++)
77 if (pc
->buffer
[t
->index
] == 0xFF &&
78 pc
->buffer
[t
->index
+ 1] == 0xA0) {
81 init_get_bits(&gb
, pc
->buffer
+ t
->index
,
82 8 * (pc
->index
- t
->index
));
83 if (!ff_tak_decode_frame_header(avctx
, &gb
,
84 pc
->frame_start_found
? &ti
87 !ff_tak_check_crc(pc
->buffer
+ t
->index
,
88 get_bits_count(&gb
) / 8)) {
89 if (!pc
->frame_start_found
) {
90 pc
->frame_start_found
= 1;
91 s
->duration
= t
->ti
.last_frame_samples
?
92 t
->ti
.last_frame_samples
:
95 pc
->frame_start_found
= 0;
96 next
= t
->index
- pc
->index
;
105 if (consumed
&& !buf_size
&& next
== END_NOT_FOUND
||
106 ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
109 return buf_size
+ consumed
;
112 if (next
!= END_NOT_FOUND
) {
114 pc
->overread
= FFMAX(0, -next
);
118 *poutbuf_size
= buf_size
;
122 AVCodecParser ff_tak_parser
= {
123 .codec_ids
= { AV_CODEC_ID_TAK
},
124 .priv_data_size
= sizeof(TAKParseContext
),
125 .parser_init
= tak_init
,
126 .parser_parse
= tak_parse
,
127 .parser_close
= ff_parse_close
,