3 * Copyright (c) 2008-2010 Peter Ross (pross@xvid.org)
4 * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * Technical details here:
28 * http://wiki.multimedia.cx/index.php?title=Bink_Container
33 #include "libavutil/channel_layout.h"
34 #include "libavutil/intreadwrite.h"
40 BINK_AUD_16BITS
= 0x4000, ///< prefer 16-bit output
41 BINK_AUD_STEREO
= 0x2000,
42 BINK_AUD_USEDCT
= 0x1000,
45 #define BINK_EXTRADATA_SIZE 1
46 #define BINK_MAX_AUDIO_TRACKS 256
47 #define BINK_MAX_WIDTH 7680
48 #define BINK_MAX_HEIGHT 4800
49 #define SMUSH_BLOCK_SIZE 512
51 typedef struct BinkDemuxContext
{
54 uint32_t num_audio_tracks
;
55 int current_track
; ///< audio track to return in next packet
57 int64_t audio_pts
[BINK_MAX_AUDIO_TRACKS
];
59 uint32_t remain_packet_size
;
64 static int probe(const AVProbeData
*p
)
66 const uint8_t *b
= p
->buf
;
67 int smush
= AV_RN32(p
->buf
) == AV_RN32("SMUS");
70 if (((b
[0] == 'B' && b
[1] == 'I' && b
[2] == 'K' && /* Bink 1 */
71 (b
[3] == 'b' || b
[3] == 'f' || b
[3] == 'g' || b
[3] == 'h' || b
[3] == 'i' ||
73 (b
[0] == 'K' && b
[1] == 'B' && b
[2] == '2' && /* Bink 2 */
74 (b
[3] == 'a' || b
[3] == 'd' || b
[3] == 'f' || b
[3] == 'g' || b
[3] == 'h' ||
75 b
[3] == 'i' || b
[3] == 'j' || b
[3] == 'k'))) &&
76 AV_RL32(b
+8) > 0 && // num_frames
77 AV_RL32(b
+20) > 0 && AV_RL32(b
+20) <= BINK_MAX_WIDTH
&&
78 AV_RL32(b
+24) > 0 && AV_RL32(b
+24) <= BINK_MAX_HEIGHT
&&
79 AV_RL32(b
+28) > 0 && AV_RL32(b
+32) > 0) // fps num,den
80 return AVPROBE_SCORE_MAX
;
81 b
+= SMUSH_BLOCK_SIZE
;
82 } while (smush
&& b
< p
->buf
+ p
->buf_size
- 32);
86 static int read_header(AVFormatContext
*s
)
88 BinkDemuxContext
*bink
= s
->priv_data
;
89 AVIOContext
*pb
= s
->pb
;
90 uint32_t fps_num
, fps_den
;
91 AVStream
*const vst
= avformat_new_stream(s
, NULL
);
92 FFStream
*const vsti
= ffstream(vst
);
94 uint32_t pos
, next_pos
;
96 int next_keyframe
= 1;
103 return AVERROR(ENOMEM
);
105 vst
->codecpar
->codec_tag
= avio_rl32(pb
);
106 if (vst
->codecpar
->codec_tag
== AV_RL32("SMUS")) {
108 bink
->smush_size
+= SMUSH_BLOCK_SIZE
;
109 avio_skip(pb
, SMUSH_BLOCK_SIZE
- 4);
110 vst
->codecpar
->codec_tag
= avio_rl32(pb
);
111 } while (!avio_feof(pb
) && (vst
->codecpar
->codec_tag
& 0xFFFFFF) != AV_RL32("BIK"));
113 av_log(s
, AV_LOG_ERROR
, "invalid SMUSH header: BIK not found\n");
114 return AVERROR_INVALIDDATA
;
118 bink
->file_size
= avio_rl32(pb
) + 8;
119 vst
->duration
= avio_rl32(pb
);
121 if (vst
->duration
> 1000000) {
122 av_log(s
, AV_LOG_ERROR
, "invalid header: more than 1000000 frames\n");
126 if (avio_rl32(pb
) > bink
->file_size
) {
127 av_log(s
, AV_LOG_ERROR
,
128 "invalid header: largest frame size greater than file size\n");
134 vst
->codecpar
->width
= avio_rl32(pb
);
135 vst
->codecpar
->height
= avio_rl32(pb
);
137 fps_num
= avio_rl32(pb
);
138 fps_den
= avio_rl32(pb
);
139 if (fps_num
== 0 || fps_den
== 0) {
140 av_log(s
, AV_LOG_ERROR
,
141 "invalid header: invalid fps (%"PRIu32
"/%"PRIu32
")\n",
145 avpriv_set_pts_info(vst
, 64, fps_den
, fps_num
);
146 vst
->avg_frame_rate
= av_inv_q(vst
->time_base
);
148 vst
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
149 vst
->codecpar
->codec_id
= AV_CODEC_ID_BINKVIDEO
;
151 if ((vst
->codecpar
->codec_tag
& 0xFFFFFF) == MKTAG('K', 'B', '2', 0)) {
152 av_log(s
, AV_LOG_WARNING
, "Bink 2 video is not implemented\n");
153 vst
->codecpar
->codec_id
= AV_CODEC_ID_NONE
;
156 if ((ret
= ff_get_extradata(s
, vst
->codecpar
, pb
, 4)) < 0)
159 bink
->num_audio_tracks
= avio_rl32(pb
);
161 if (bink
->num_audio_tracks
> BINK_MAX_AUDIO_TRACKS
) {
162 av_log(s
, AV_LOG_ERROR
,
163 "invalid header: more than "AV_STRINGIFY(BINK_MAX_AUDIO_TRACKS
)" audio tracks (%"PRIu32
")\n",
164 bink
->num_audio_tracks
);
168 signature
= (vst
->codecpar
->codec_tag
& 0xFFFFFF);
169 revision
= ((vst
->codecpar
->codec_tag
>> 24) % 0xFF);
171 if ((signature
== AV_RL32("BIK") && (revision
== 'k')) ||
172 (signature
== AV_RL32("KB2") && (revision
== 'i' || revision
== 'j' || revision
== 'k')))
173 avio_skip(pb
, 4); /* unknown new field */
175 if (bink
->num_audio_tracks
) {
176 avio_skip(pb
, 4 * bink
->num_audio_tracks
); /* max decoded size */
178 for (i
= 0; i
< bink
->num_audio_tracks
; i
++) {
179 AVStream
*const ast
= avformat_new_stream(s
, NULL
);
181 return AVERROR(ENOMEM
);
182 ast
->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
183 ast
->codecpar
->codec_tag
= 0;
184 ast
->codecpar
->sample_rate
= avio_rl16(pb
);
185 avpriv_set_pts_info(ast
, 64, 1, ast
->codecpar
->sample_rate
);
186 flags
= avio_rl16(pb
);
187 ast
->codecpar
->codec_id
= flags
& BINK_AUD_USEDCT
?
188 AV_CODEC_ID_BINKAUDIO_DCT
: AV_CODEC_ID_BINKAUDIO_RDFT
;
189 if (flags
& BINK_AUD_STEREO
) {
190 ast
->codecpar
->ch_layout
= (AVChannelLayout
)AV_CHANNEL_LAYOUT_STEREO
;
192 ast
->codecpar
->ch_layout
= (AVChannelLayout
)AV_CHANNEL_LAYOUT_MONO
;
194 if ((ret
= ff_alloc_extradata(ast
->codecpar
, 4)) < 0)
196 AV_WL32(ast
->codecpar
->extradata
, vst
->codecpar
->codec_tag
);
199 for (i
= 0; i
< bink
->num_audio_tracks
; i
++)
200 s
->streams
[i
+ 1]->id
= avio_rl32(pb
);
203 /* frame index table */
204 next_pos
= avio_rl32(pb
);
205 for (i
= 0; i
< vst
->duration
; i
++) {
207 keyframe
= next_keyframe
;
208 if (i
== vst
->duration
- 1) {
209 next_pos
= bink
->file_size
;
212 next_pos
= avio_rl32(pb
);
213 next_keyframe
= next_pos
& 1;
218 if (next_pos
<= pos
) {
219 av_log(s
, AV_LOG_ERROR
, "invalid frame index table\n");
222 if ((ret
= av_add_index_entry(vst
, pos
, i
, next_pos
- pos
, 0,
223 keyframe
? AVINDEX_KEYFRAME
: 0)) < 0)
227 if (vsti
->index_entries
)
228 avio_seek(pb
, vsti
->index_entries
[0].pos
+ bink
->smush_size
, SEEK_SET
);
232 bink
->current_track
= -1;
236 static int read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
238 BinkDemuxContext
*bink
= s
->priv_data
;
239 AVIOContext
*pb
= s
->pb
;
242 if (bink
->current_track
< 0) {
244 AVStream
*st
= s
->streams
[0]; // stream 0 is video stream with index
245 FFStream
*const sti
= ffstream(st
);
247 if (bink
->video_pts
>= st
->duration
)
250 index_entry
= av_index_search_timestamp(st
, bink
->video_pts
,
252 if (index_entry
< 0) {
253 av_log(s
, AV_LOG_ERROR
,
254 "could not find index entry for frame %"PRId64
"\n",
259 bink
->remain_packet_size
= sti
->index_entries
[index_entry
].size
;
260 bink
->flags
= sti
->index_entries
[index_entry
].flags
;
261 bink
->current_track
= 0;
264 while (bink
->current_track
< bink
->num_audio_tracks
) {
265 uint32_t audio_size
= avio_rl32(pb
);
266 if (audio_size
> bink
->remain_packet_size
- 4) {
267 av_log(s
, AV_LOG_ERROR
,
268 "frame %"PRId64
": audio size in header (%"PRIu32
") > size of packet left (%"PRIu32
")\n",
269 bink
->video_pts
, audio_size
, bink
->remain_packet_size
);
272 bink
->remain_packet_size
-= 4 + audio_size
;
273 bink
->current_track
++;
274 if (audio_size
>= 4) {
275 /* get one audio packet per track */
276 if ((ret
= av_get_packet(pb
, pkt
, audio_size
)) < 0)
278 pkt
->stream_index
= bink
->current_track
;
279 pkt
->pts
= bink
->audio_pts
[bink
->current_track
- 1];
281 /* Each audio packet reports the number of decompressed samples
282 (in bytes). We use this value to calculate the audio PTS */
284 bink
->audio_pts
[bink
->current_track
-1] +=
285 AV_RL32(pkt
->data
) / (2 * s
->streams
[bink
->current_track
]->codecpar
->ch_layout
.nb_channels
);
288 avio_skip(pb
, audio_size
);
292 /* get video packet */
293 if ((ret
= av_get_packet(pb
, pkt
, bink
->remain_packet_size
)) < 0)
295 pkt
->stream_index
= 0;
296 pkt
->pts
= bink
->video_pts
++;
297 if (bink
->flags
& AVINDEX_KEYFRAME
)
298 pkt
->flags
|= AV_PKT_FLAG_KEY
;
300 /* -1 instructs the next call to read_packet() to read the next frame */
301 bink
->current_track
= -1;
306 static int read_seek(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
308 BinkDemuxContext
*bink
= s
->priv_data
;
309 AVStream
*vst
= s
->streams
[0];
310 FFStream
*const vsti
= ffstream(vst
);
313 if (!(s
->pb
->seekable
& AVIO_SEEKABLE_NORMAL
))
316 /* seek to the first frame */
317 ret
= avio_seek(s
->pb
, vsti
->index_entries
[0].pos
+ bink
->smush_size
, SEEK_SET
);
322 memset(bink
->audio_pts
, 0, sizeof(bink
->audio_pts
));
323 bink
->current_track
= -1;
327 const FFInputFormat ff_bink_demuxer
= {
329 .p
.long_name
= NULL_IF_CONFIG_SMALL("Bink"),
330 .p
.flags
= AVFMT_SHOW_IDS
,
331 .priv_data_size
= sizeof(BinkDemuxContext
),
333 .read_header
= read_header
,
334 .read_packet
= read_packet
,
335 .read_seek
= read_seek
,