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
27 #define CACHED_BITSTREAM_READER !ARCH_X86_32
28 #define BITSTREAM_READER_LE
32 typedef struct TAKParseContext
{
38 static int tak_parse(AVCodecParserContext
*s
, AVCodecContext
*avctx
,
39 const uint8_t **poutbuf
, int *poutbuf_size
,
40 const uint8_t *buf
, int buf_size
)
42 TAKParseContext
*t
= s
->priv_data
;
43 ParseContext
*pc
= &t
->pc
;
44 int next
= END_NOT_FOUND
;
47 int needed
= buf_size
? TAK_MAX_FRAME_HEADER_BYTES
: 8;
51 *poutbuf_size
= buf_size
;
53 if (s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
55 if ((ret
= init_get_bits8(&gb
, buf
, buf_size
)) < 0)
57 if (!ff_tak_decode_frame_header(avctx
, &gb
, &ti
, 127))
58 s
->duration
= t
->ti
.last_frame_samples
? t
->ti
.last_frame_samples
59 : t
->ti
.frame_samples
;
63 while (buf_size
|| t
->index
+ needed
<= pc
->index
) {
64 if (buf_size
&& t
->index
+ TAK_MAX_FRAME_HEADER_BYTES
> pc
->index
) {
65 int tmp_buf_size
= FFMIN(TAK_MAX_FRAME_HEADER_BYTES
,
67 const uint8_t *tmp_buf
= buf
;
69 if (ff_combine_frame(pc
, END_NOT_FOUND
, &tmp_buf
, &tmp_buf_size
) != -1)
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 if ((ret
= init_get_bits8(&gb
, pc
->buffer
+ t
->index
,
82 pc
->index
- t
->index
)) < 0)
84 if (!ff_tak_decode_frame_header(avctx
, &gb
,
85 pc
->frame_start_found
? &ti
: &t
->ti
, 127) &&
86 !ff_tak_check_crc(pc
->buffer
+ t
->index
,
87 get_bits_count(&gb
) / 8)) {
88 if (!pc
->frame_start_found
) {
89 pc
->frame_start_found
= 1;
90 s
->duration
= t
->ti
.last_frame_samples
?
91 t
->ti
.last_frame_samples
:
93 s
->key_frame
= !!(t
->ti
.flags
& TAK_FRAME_FLAG_HAS_INFO
);
95 pc
->frame_start_found
= 0;
96 next
= t
->index
- pc
->index
;
106 if (consumed
&& !buf_size
&& next
== END_NOT_FOUND
||
107 ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
111 if (next
!= END_NOT_FOUND
) {
113 pc
->overread
= FFMAX(0, -next
);
117 *poutbuf_size
= buf_size
;
123 return buf_size
+ consumed
;
126 const AVCodecParser ff_tak_parser
= {
127 .codec_ids
= { AV_CODEC_ID_TAK
},
128 .priv_data_size
= sizeof(TAKParseContext
),
129 .parser_parse
= tak_parse
,
130 .parser_close
= ff_parse_close
,