bethsoftvid: fix read_packet() return codes.

Use proper AVERROR codes, and return 0 for no error.
This commit is contained in:
Justin Ruggles 2012-01-18 18:46:38 -05:00
parent f320fb894c
commit 17b115591f

View File

@ -109,6 +109,7 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
int bytes_copied = 0; int bytes_copied = 0;
int position; int position;
unsigned int vidbuf_capacity; unsigned int vidbuf_capacity;
int ret = 0;
vidbuf_start = av_malloc(vidbuf_capacity = BUFFER_PADDING_SIZE); vidbuf_start = av_malloc(vidbuf_capacity = BUFFER_PADDING_SIZE);
if(!vidbuf_start) if(!vidbuf_start)
@ -124,8 +125,10 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
// set the y offset if it exists (decoder header data should be in data section) // set the y offset if it exists (decoder header data should be in data section)
if(block_type == VIDEO_YOFF_P_FRAME){ if(block_type == VIDEO_YOFF_P_FRAME){
if(avio_read(pb, &vidbuf_start[vidbuf_nbytes], 2) != 2) if (avio_read(pb, &vidbuf_start[vidbuf_nbytes], 2) != 2) {
ret = AVERROR(EIO);
goto fail; goto fail;
}
vidbuf_nbytes += 2; vidbuf_nbytes += 2;
} }
@ -141,8 +144,10 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
if(block_type == VIDEO_I_FRAME) if(block_type == VIDEO_I_FRAME)
vidbuf_start[vidbuf_nbytes++] = avio_r8(pb); vidbuf_start[vidbuf_nbytes++] = avio_r8(pb);
} else if(code){ // plain sequence } else if(code){ // plain sequence
if(avio_read(pb, &vidbuf_start[vidbuf_nbytes], code) != code) if (avio_read(pb, &vidbuf_start[vidbuf_nbytes], code) != code) {
ret = AVERROR(EIO);
goto fail; goto fail;
}
vidbuf_nbytes += code; vidbuf_nbytes += code;
} }
bytes_copied += code & 0x7F; bytes_copied += code & 0x7F;
@ -152,12 +157,14 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
avio_seek(pb, -1, SEEK_CUR); avio_seek(pb, -1, SEEK_CUR);
break; break;
} }
if(bytes_copied > npixels) if (bytes_copied > npixels) {
ret = AVERROR_INVALIDDATA;
goto fail; goto fail;
}
} while(code); } while(code);
// copy data into packet // copy data into packet
if(av_new_packet(pkt, vidbuf_nbytes) < 0) if ((ret = av_new_packet(pkt, vidbuf_nbytes)) < 0)
goto fail; goto fail;
memcpy(pkt->data, vidbuf_start, vidbuf_nbytes); memcpy(pkt->data, vidbuf_start, vidbuf_nbytes);
av_free(vidbuf_start); av_free(vidbuf_start);
@ -175,10 +182,10 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
} }
vid->nframes--; // used to check if all the frames were read vid->nframes--; // used to check if all the frames were read
return vidbuf_nbytes; return 0;
fail: fail:
av_free(vidbuf_start); av_free(vidbuf_start);
return -1; return ret;
} }
static int vid_read_packet(AVFormatContext *s, static int vid_read_packet(AVFormatContext *s,
@ -216,9 +223,14 @@ static int vid_read_packet(AVFormatContext *s,
s->streams[1]->codec->bit_rate = s->streams[1]->codec->channels * s->streams[1]->codec->sample_rate * s->streams[1]->codec->bits_per_coded_sample; s->streams[1]->codec->bit_rate = s->streams[1]->codec->channels * s->streams[1]->codec->sample_rate * s->streams[1]->codec->bits_per_coded_sample;
case AUDIO_BLOCK: case AUDIO_BLOCK:
audio_length = avio_rl16(pb); audio_length = avio_rl16(pb);
ret_value = av_get_packet(pb, pkt, audio_length); if ((ret_value = av_get_packet(pb, pkt, audio_length)) != audio_length) {
if (ret_value < 0)
return ret_value;
av_log(s, AV_LOG_ERROR, "incomplete audio block\n");
return AVERROR(EIO);
}
pkt->stream_index = 1; pkt->stream_index = 1;
return ret_value != audio_length ? AVERROR(EIO) : ret_value; return 0;
case VIDEO_P_FRAME: case VIDEO_P_FRAME:
case VIDEO_YOFF_P_FRAME: case VIDEO_YOFF_P_FRAME:
@ -233,7 +245,8 @@ static int vid_read_packet(AVFormatContext *s,
return AVERROR(EIO); return AVERROR(EIO);
default: default:
av_log(s, AV_LOG_ERROR, "unknown block (character = %c, decimal = %d, hex = %x)!!!\n", av_log(s, AV_LOG_ERROR, "unknown block (character = %c, decimal = %d, hex = %x)!!!\n",
block_type, block_type, block_type); return -1; block_type, block_type, block_type);
return AVERROR_INVALIDDATA;
} }
} }