get_bi(), be/le fix

Originally committed as revision 2254 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 22 years ago
parent 8fc6c2b537
commit 8c653280bd
  1. 42
      libavformat/nut.c

@ -86,16 +86,35 @@ static int64_t get_s(ByteIOContext *bc)
return (v>>1);
}
static int get_b(ByteIOContext *bc)
static int get_b(ByteIOContext *bc, char *data, int maxlen)
{
int i, len, val;
int i, len;
len = get_v(bc);
for (i = 0; i < len && i < maxlen; i++)
data[i] = get_byte(bc);
if (i < len)
{
len = i;
for (i = 0; i < len; i++)
get_byte(bc);
}
return 0;
}
static int get_bi(ByteIOContext *bc)
{
int i, len, val;
len = get_v(bc);
if(len > 4) return -1;
val = 0;
for (i = 0; i < len; i++) {
if (i < 4)
val |= get_byte(bc) << (i * 8);
val |= get_byte(bc) << (i * 8);
}
return val;
}
@ -337,8 +356,7 @@ static int nut_write_packet(AVFormatContext *s, int stream_index,
return 1;
enc = &s->streams[stream_index]->codec;
if (enc->codec_type == CODEC_TYPE_VIDEO)
key_frame = enc->coded_frame->key_frame;
key_frame = enc->coded_frame->key_frame;
if (key_frame)
put_be64(bc, KEYFRAME_STARTCODE);
@ -397,7 +415,6 @@ static int nut_probe(AVProbeData *p)
for (i = 0; i < p->buf_size; i++) {
int c = p->buf[i];
code = (code << 8) | c;
code &= 0xFFFFFFFFFFFFFFFFULL;
if (code == MAIN_STARTCODE)
return AVPROBE_SCORE_MAX;
}
@ -444,18 +461,17 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
if (!st)
return AVERROR_NOMEM;
class = get_v(bc);
tmp = get_bi(bc);
switch(class)
{
case 0:
st->codec.codec_type = CODEC_TYPE_VIDEO;
tmp = get_b(bc);
st->codec.codec_id = codec_get_bmp_id(tmp);
if (st->codec.codec_id == CODEC_ID_NONE)
fprintf(stderr, "Unknown codec?!\n");
break;
case 32:
st->codec.codec_type = CODEC_TYPE_AUDIO;
tmp = get_b(bc);
st->codec.codec_id = codec_get_wav_id(tmp);
if (st->codec.codec_id == CODEC_ID_NONE)
fprintf(stderr, "Unknown codec?!\n");
@ -465,9 +481,7 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
return -1;
}
s->bit_rate += get_v(bc);
tmp = get_v(bc); /* language code */
while(tmp--)
get_byte(bc);
get_b(bc, NULL, 0); /* language code */
st->codec.frame_rate_base = get_v(bc);
st->codec.frame_rate = get_v(bc);
get_v(bc); /* FIXME: msb timestamp base */
@ -483,13 +497,13 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
get_v(bc); /* aspected w */
get_v(bc); /* aspected h */
get_v(bc); /* csp type */
get_le32(bc); /* checksum */
get_be32(bc); /* checksum */
}
if (class == 32) /* AUDIO */
{
st->codec.sample_rate = get_v(bc) * (double)(st->codec.frame_rate_base / st->codec.frame_rate);
st->codec.channels = get_v(bc);
get_le32(bc); /* checksum */
get_be32(bc); /* checksum */
}
}

Loading…
Cancel
Save