[FFmpeg-devel] Bink audio decoder

Eli Friedman eli.friedman
Wed Apr 9 22:25:39 CEST 2008


On Wed, Apr 9, 2008 at 6:47 AM,  <pross at xvid.org> wrote:
> Hi,
>
>  Enclosed is a working demuxer and audio decoder for the Bink multimedia
>  format. The patch has been tested on PPC hardware only, but should run
>  elsewhere.

A quick look at the demuxer:

+static int bink_probe(AVProbeData *p)
+{
+    const uint8_t *b = p->buf;
+
+    if (b[0] == 'B' && b[1] == 'I' && b[2] == 'K')
+        return AVPROBE_SCORE_MAX;
+    return 0;
+}

Hmm, this looks a bit sensitive (overlikely to trigger)... you should
probably also check for a known version number in b[3], and possibly
also that the video width and height are sane.

+        case 'b' :
+        case 'f' :
+        case 'i' :
+            break;
+        default:
+            av_log(s, AV_LOG_INFO, "unsupported bink container
version 0x%x\n", version);
+            return -1;

http://wiki.multimedia.cx/index.php?title=Bink_Container claims that
there are also versions 'g' and 'h'; have you not tested any of these
samples yet?

+        url_fseek(pb, bink->index_pos + (bink->video_pts+1)*4, SEEK_SET);

It would probably be cleaner to read the entire index while you're
reading the header.  (See av_add_index_entry.)

+    st->codec->codec_id = CODEC_ID_BINKVIDEO;

If you're not actually adding the codec, you should comment out this
line and add "st->codec->codec_id = 0;"

+  unsigned int file_size;
+  unsigned int total_frames;
+  int64_t index_pos;

How exactly can index_pos not fit into an unsigned int?

+        AVStream **st;
+        int i;
+
+        st = av_malloc(bink->num_tracks*sizeof(AVStream*));

Don't allocate your own memory; just use s->streams to iterate over
the streams the second time.  (Plus, as written, it's a buffer
overflow vulnerability.)

+    if (av_get_packet(s->pb, pkt, bink->remain_packet_size) !=
bink->remain_packet_size)
+        return AVERROR(EIO);
+    pkt->stream_index = 0;
+    pkt->pts = bink->video_pts++;

If Bink video is guaranteed to have one frame per packet, add a
comment to that effect.

+    bink->packet_pos = get_le32(pb) - 1;

What the heck is the -1 there for?  Needs a comment.

+            pkt->pts = bink->audio_pts++;

This isn't going to work with multiple audio tracks.

+        if (audio_size > 0) {

Can there be a zero-size audio packet?  If it's impossible, you should
return an error.

You should set PKT_FLAG_KEY at least for the first packet.

-Eli




More information about the ffmpeg-devel mailing list