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"
39 BINK_AUD_16BITS
= 0x4000, ///< prefer 16-bit output
40 BINK_AUD_STEREO
= 0x2000,
41 BINK_AUD_USEDCT
= 0x1000,
44 #define BINK_EXTRADATA_SIZE 1
45 #define BINK_MAX_AUDIO_TRACKS 256
46 #define BINK_MAX_WIDTH 7680
47 #define BINK_MAX_HEIGHT 4800
52 uint32_t num_audio_tracks
;
53 int current_track
; ///< audio track to return in next packet
55 int64_t audio_pts
[BINK_MAX_AUDIO_TRACKS
];
57 uint32_t remain_packet_size
;
60 static int probe(AVProbeData
*p
)
62 const uint8_t *b
= p
->buf
;
64 if (((b
[0] == 'B' && b
[1] == 'I' && b
[2] == 'K' &&
65 (b
[3] == 'b' || b
[3] == 'f' || b
[3] == 'g' || b
[3] == 'h' || b
[3] == 'i')) ||
66 (b
[0] == 'K' && b
[1] == 'B' && b
[2] == '2' && /* Bink 2 */
67 (b
[3] == 'a' || b
[3] == 'd' || b
[3] == 'f' || b
[3] == 'g'))) &&
68 AV_RL32(b
+8) > 0 && // num_frames
69 AV_RL32(b
+20) > 0 && AV_RL32(b
+20) <= BINK_MAX_WIDTH
&&
70 AV_RL32(b
+24) > 0 && AV_RL32(b
+24) <= BINK_MAX_HEIGHT
&&
71 AV_RL32(b
+28) > 0 && AV_RL32(b
+32) > 0) // fps num,den
72 return AVPROBE_SCORE_MAX
;
76 static int read_header(AVFormatContext
*s
)
78 BinkDemuxContext
*bink
= s
->priv_data
;
79 AVIOContext
*pb
= s
->pb
;
80 uint32_t fps_num
, fps_den
;
83 uint32_t pos
, next_pos
;
88 vst
= avformat_new_stream(s
, NULL
);
90 return AVERROR(ENOMEM
);
92 vst
->codec
->codec_tag
= avio_rl32(pb
);
94 bink
->file_size
= avio_rl32(pb
) + 8;
95 vst
->duration
= avio_rl32(pb
);
97 if (vst
->duration
> 1000000) {
98 av_log(s
, AV_LOG_ERROR
, "invalid header: more than 1000000 frames\n");
102 if (avio_rl32(pb
) > bink
->file_size
) {
103 av_log(s
, AV_LOG_ERROR
,
104 "invalid header: largest frame size greater than file size\n");
110 vst
->codec
->width
= avio_rl32(pb
);
111 vst
->codec
->height
= avio_rl32(pb
);
113 fps_num
= avio_rl32(pb
);
114 fps_den
= avio_rl32(pb
);
115 if (fps_num
== 0 || fps_den
== 0) {
116 av_log(s
, AV_LOG_ERROR
,
117 "invalid header: invalid fps (%"PRIu32
"/%"PRIu32
")\n",
121 avpriv_set_pts_info(vst
, 64, fps_den
, fps_num
);
122 vst
->avg_frame_rate
= av_inv_q(vst
->time_base
);
124 vst
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
125 vst
->codec
->codec_id
= AV_CODEC_ID_BINKVIDEO
;
127 if ((vst
->codec
->codec_tag
& 0xFFFFFF) == MKTAG('K', 'B', '2', 0)) {
128 av_log(s
, AV_LOG_WARNING
, "Bink 2 video is not implemented\n");
129 vst
->codec
->codec_id
= AV_CODEC_ID_NONE
;
132 if (ff_get_extradata(vst
->codec
, pb
, 4) < 0)
133 return AVERROR(ENOMEM
);
135 bink
->num_audio_tracks
= avio_rl32(pb
);
137 if (bink
->num_audio_tracks
> BINK_MAX_AUDIO_TRACKS
) {
138 av_log(s
, AV_LOG_ERROR
,
139 "invalid header: more than "AV_STRINGIFY(BINK_MAX_AUDIO_TRACKS
)" audio tracks (%"PRIu32
")\n",
140 bink
->num_audio_tracks
);
144 if (bink
->num_audio_tracks
) {
145 avio_skip(pb
, 4 * bink
->num_audio_tracks
);
147 for (i
= 0; i
< bink
->num_audio_tracks
; i
++) {
148 ast
= avformat_new_stream(s
, NULL
);
150 return AVERROR(ENOMEM
);
151 ast
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
152 ast
->codec
->codec_tag
= 0;
153 ast
->codec
->sample_rate
= avio_rl16(pb
);
154 avpriv_set_pts_info(ast
, 64, 1, ast
->codec
->sample_rate
);
155 flags
= avio_rl16(pb
);
156 ast
->codec
->codec_id
= flags
& BINK_AUD_USEDCT
?
157 AV_CODEC_ID_BINKAUDIO_DCT
: AV_CODEC_ID_BINKAUDIO_RDFT
;
158 if (flags
& BINK_AUD_STEREO
) {
159 ast
->codec
->channels
= 2;
160 ast
->codec
->channel_layout
= AV_CH_LAYOUT_STEREO
;
162 ast
->codec
->channels
= 1;
163 ast
->codec
->channel_layout
= AV_CH_LAYOUT_MONO
;
165 if (ff_alloc_extradata(ast
->codec
, 4))
166 return AVERROR(ENOMEM
);
167 AV_WL32(ast
->codec
->extradata
, vst
->codec
->codec_tag
);
170 for (i
= 0; i
< bink
->num_audio_tracks
; i
++)
171 s
->streams
[i
+ 1]->id
= avio_rl32(pb
);
174 /* frame index table */
175 next_pos
= avio_rl32(pb
);
176 for (i
= 0; i
< vst
->duration
; i
++) {
178 if (i
== vst
->duration
- 1) {
179 next_pos
= bink
->file_size
;
182 next_pos
= avio_rl32(pb
);
188 if (next_pos
<= pos
) {
189 av_log(s
, AV_LOG_ERROR
, "invalid frame index table\n");
192 if ((ret
= av_add_index_entry(vst
, pos
, i
, next_pos
- pos
, 0,
193 keyframe
? AVINDEX_KEYFRAME
: 0)) < 0)
197 avio_seek(pb
, vst
->index_entries
[0].pos
, SEEK_SET
);
199 bink
->current_track
= -1;
203 static int read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
205 BinkDemuxContext
*bink
= s
->priv_data
;
206 AVIOContext
*pb
= s
->pb
;
209 if (bink
->current_track
< 0) {
211 AVStream
*st
= s
->streams
[0]; // stream 0 is video stream with index
213 if (bink
->video_pts
>= st
->duration
)
216 index_entry
= av_index_search_timestamp(st
, bink
->video_pts
,
218 if (index_entry
< 0) {
219 av_log(s
, AV_LOG_ERROR
,
220 "could not find index entry for frame %"PRId64
"\n",
225 bink
->remain_packet_size
= st
->index_entries
[index_entry
].size
;
226 bink
->current_track
= 0;
229 while (bink
->current_track
< bink
->num_audio_tracks
) {
230 uint32_t audio_size
= avio_rl32(pb
);
231 if (audio_size
> bink
->remain_packet_size
- 4) {
232 av_log(s
, AV_LOG_ERROR
,
233 "frame %"PRId64
": audio size in header (%"PRIu32
") > size of packet left (%"PRIu32
")\n",
234 bink
->video_pts
, audio_size
, bink
->remain_packet_size
);
237 bink
->remain_packet_size
-= 4 + audio_size
;
238 bink
->current_track
++;
239 if (audio_size
>= 4) {
240 /* get one audio packet per track */
241 if ((ret
= av_get_packet(pb
, pkt
, audio_size
)) < 0)
243 pkt
->stream_index
= bink
->current_track
;
244 pkt
->pts
= bink
->audio_pts
[bink
->current_track
- 1];
246 /* Each audio packet reports the number of decompressed samples
247 (in bytes). We use this value to calcuate the audio PTS */
249 bink
->audio_pts
[bink
->current_track
-1] +=
250 AV_RL32(pkt
->data
) / (2 * s
->streams
[bink
->current_track
]->codec
->channels
);
253 avio_skip(pb
, audio_size
);
257 /* get video packet */
258 if ((ret
= av_get_packet(pb
, pkt
, bink
->remain_packet_size
)) < 0)
260 pkt
->stream_index
= 0;
261 pkt
->pts
= bink
->video_pts
++;
262 pkt
->flags
|= AV_PKT_FLAG_KEY
;
264 /* -1 instructs the next call to read_packet() to read the next frame */
265 bink
->current_track
= -1;
270 static int read_seek(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
272 BinkDemuxContext
*bink
= s
->priv_data
;
273 AVStream
*vst
= s
->streams
[0];
275 if (!s
->pb
->seekable
)
278 /* seek to the first frame */
279 if (avio_seek(s
->pb
, vst
->index_entries
[0].pos
, SEEK_SET
) < 0)
283 memset(bink
->audio_pts
, 0, sizeof(bink
->audio_pts
));
284 bink
->current_track
= -1;
288 AVInputFormat ff_bink_demuxer
= {
290 .long_name
= NULL_IF_CONFIG_SMALL("Bink"),
291 .priv_data_size
= sizeof(BinkDemuxContext
),
293 .read_header
= read_header
,
294 .read_packet
= read_packet
,
295 .read_seek
= read_seek
,
296 .flags
= AVFMT_SHOW_IDS
,