3 * Copyright (c) 2012 Michael Niedermayer
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 int tak_parse(AVCodecParserContext
*s
, AVCodecContext
*avctx
,
37 const uint8_t **poutbuf
, int *poutbuf_size
,
38 const uint8_t *buf
, int buf_size
)
40 TAKParseContext
*t
= s
->priv_data
;
41 ParseContext
*pc
= &t
->pc
;
42 int next
= END_NOT_FOUND
;
45 int needed
= buf_size
? TAK_MAX_FRAME_HEADER_BYTES
: 8;
47 if (s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
49 init_get_bits(&gb
, buf
, buf_size
);
50 if (!ff_tak_decode_frame_header(avctx
, &gb
, &ti
, 127))
51 s
->duration
= t
->ti
.last_frame_samples
? t
->ti
.last_frame_samples
52 : t
->ti
.frame_samples
;
54 *poutbuf_size
= buf_size
;
58 while (buf_size
|| t
->index
+ needed
<= pc
->index
) {
59 if (buf_size
&& t
->index
+ TAK_MAX_FRAME_HEADER_BYTES
> pc
->index
) {
60 int tmp_buf_size
= FFMIN(2 * TAK_MAX_FRAME_HEADER_BYTES
,
62 const uint8_t *tmp_buf
= buf
;
64 if (ff_combine_frame(pc
, END_NOT_FOUND
, &tmp_buf
, &tmp_buf_size
) != -1)
65 return AVERROR(ENOMEM
);
66 consumed
+= tmp_buf_size
;
68 buf_size
-= tmp_buf_size
;
71 for (; t
->index
+ needed
<= pc
->index
; t
->index
++) {
72 if (pc
->buffer
[ t
->index
] == 0xFF &&
73 pc
->buffer
[ t
->index
+ 1 ] == 0xA0) {
76 init_get_bits(&gb
, pc
->buffer
+ t
->index
,
77 8 * (pc
->index
- t
->index
));
78 if (!ff_tak_decode_frame_header(avctx
, &gb
,
79 pc
->frame_start_found
? &ti
: &t
->ti
, 127) &&
80 !ff_tak_check_crc(pc
->buffer
+ t
->index
,
81 get_bits_count(&gb
) / 8)) {
82 if (!pc
->frame_start_found
) {
83 pc
->frame_start_found
= 1;
84 s
->duration
= t
->ti
.last_frame_samples
?
85 t
->ti
.last_frame_samples
:
87 s
->key_frame
= !!(t
->ti
.flags
& TAK_FRAME_FLAG_HAS_INFO
);
89 pc
->frame_start_found
= 0;
90 next
= t
->index
- pc
->index
;
100 if (consumed
&& !buf_size
&& next
== END_NOT_FOUND
||
101 ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
104 return buf_size
+ consumed
;
107 if (next
!= END_NOT_FOUND
) {
109 pc
->overread
= FFMAX(0, -next
);
113 *poutbuf_size
= buf_size
;
117 AVCodecParser ff_tak_parser
= {
118 .codec_ids
= { AV_CODEC_ID_TAK
},
119 .priv_data_size
= sizeof(TAKParseContext
),
120 .parser_parse
= tak_parse
,
121 .parser_close
= ff_parse_close
,