Commit 559ee127 authored by michael's avatar michael

write error handling


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@3572 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent cce9a56c
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
extern "C" { extern "C" {
#endif #endif
#define LIBAVFORMAT_BUILD 4617 #define LIBAVFORMAT_BUILD 4618
#define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVFORMAT_VERSION FFMPEG_VERSION #define LIBAVFORMAT_VERSION FFMPEG_VERSION
......
...@@ -70,7 +70,7 @@ typedef struct { ...@@ -70,7 +70,7 @@ typedef struct {
unsigned char *buf_ptr, *buf_end; unsigned char *buf_ptr, *buf_end;
void *opaque; void *opaque;
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
void (*write_packet)(void *opaque, uint8_t *buf, int buf_size); int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
int (*seek)(void *opaque, offset_t offset, int whence); int (*seek)(void *opaque, offset_t offset, int whence);
offset_t pos; /* position in the file of the current buffer */ offset_t pos; /* position in the file of the current buffer */
int must_flush; /* true if the next seek should flush */ int must_flush; /* true if the next seek should flush */
...@@ -81,6 +81,7 @@ typedef struct { ...@@ -81,6 +81,7 @@ typedef struct {
unsigned long checksum; unsigned long checksum;
unsigned char *checksum_ptr; unsigned char *checksum_ptr;
unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
int error; ///< contains the error code or 0 if no error happened
} ByteIOContext; } ByteIOContext;
int init_put_byte(ByteIOContext *s, int init_put_byte(ByteIOContext *s,
...@@ -89,7 +90,7 @@ int init_put_byte(ByteIOContext *s, ...@@ -89,7 +90,7 @@ int init_put_byte(ByteIOContext *s,
int write_flag, int write_flag,
void *opaque, void *opaque,
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
void (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int (*seek)(void *opaque, offset_t offset, int whence)); int (*seek)(void *opaque, offset_t offset, int whence));
void put_byte(ByteIOContext *s, int b); void put_byte(ByteIOContext *s, int b);
...@@ -109,6 +110,7 @@ offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence); ...@@ -109,6 +110,7 @@ offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
void url_fskip(ByteIOContext *s, offset_t offset); void url_fskip(ByteIOContext *s, offset_t offset);
offset_t url_ftell(ByteIOContext *s); offset_t url_ftell(ByteIOContext *s);
int url_feof(ByteIOContext *s); int url_feof(ByteIOContext *s);
int url_ferror(ByteIOContext *s);
#define URL_EOF (-1) #define URL_EOF (-1)
int url_fgetc(ByteIOContext *s); int url_fgetc(ByteIOContext *s);
......
...@@ -28,7 +28,7 @@ int init_put_byte(ByteIOContext *s, ...@@ -28,7 +28,7 @@ int init_put_byte(ByteIOContext *s,
int write_flag, int write_flag,
void *opaque, void *opaque,
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
void (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int (*seek)(void *opaque, offset_t offset, int whence)) int (*seek)(void *opaque, offset_t offset, int whence))
{ {
s->buffer = buffer; s->buffer = buffer;
...@@ -46,6 +46,7 @@ int init_put_byte(ByteIOContext *s, ...@@ -46,6 +46,7 @@ int init_put_byte(ByteIOContext *s,
s->pos = 0; s->pos = 0;
s->must_flush = 0; s->must_flush = 0;
s->eof_reached = 0; s->eof_reached = 0;
s->error = 0;
s->is_streamed = 0; s->is_streamed = 0;
s->max_packet_size = 0; s->max_packet_size = 0;
s->update_checksum= NULL; s->update_checksum= NULL;
...@@ -57,8 +58,12 @@ int init_put_byte(ByteIOContext *s, ...@@ -57,8 +58,12 @@ int init_put_byte(ByteIOContext *s,
static void flush_buffer(ByteIOContext *s) static void flush_buffer(ByteIOContext *s)
{ {
if (s->buf_ptr > s->buffer) { if (s->buf_ptr > s->buffer) {
if (s->write_packet) if (s->write_packet && !s->error){
s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer); int ret= s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer);
if(ret < 0){
s->error = ret;
}
}
if(s->update_checksum){ if(s->update_checksum){
s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr); s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr);
s->checksum_ptr= s->buffer; s->checksum_ptr= s->buffer;
...@@ -172,6 +177,11 @@ int url_feof(ByteIOContext *s) ...@@ -172,6 +177,11 @@ int url_feof(ByteIOContext *s)
return s->eof_reached; return s->eof_reached;
} }
int url_ferror(ByteIOContext *s)
{
return s->error;
}
#ifdef CONFIG_ENCODERS #ifdef CONFIG_ENCODERS
void put_le32(ByteIOContext *s, unsigned int val) void put_le32(ByteIOContext *s, unsigned int val)
{ {
...@@ -260,6 +270,8 @@ static void fill_buffer(ByteIOContext *s) ...@@ -260,6 +270,8 @@ static void fill_buffer(ByteIOContext *s)
/* do not modify buffer if EOF reached so that a seek back can /* do not modify buffer if EOF reached so that a seek back can
be done without rereading data */ be done without rereading data */
s->eof_reached = 1; s->eof_reached = 1;
if(len<0)
s->error= len;
} else { } else {
s->pos += len; s->pos += len;
s->buf_ptr = s->buffer; s->buf_ptr = s->buffer;
...@@ -432,10 +444,10 @@ uint64_t get_be64(ByteIOContext *s) ...@@ -432,10 +444,10 @@ uint64_t get_be64(ByteIOContext *s)
/* link with avio functions */ /* link with avio functions */
#ifdef CONFIG_ENCODERS #ifdef CONFIG_ENCODERS
static void url_write_packet(void *opaque, uint8_t *buf, int buf_size) static int url_write_packet(void *opaque, uint8_t *buf, int buf_size)
{ {
URLContext *h = opaque; URLContext *h = opaque;
url_write(h, buf, buf_size); return url_write(h, buf, buf_size);
} }
#else #else
#define url_write_packet NULL #define url_write_packet NULL
...@@ -609,7 +621,7 @@ typedef struct DynBuffer { ...@@ -609,7 +621,7 @@ typedef struct DynBuffer {
uint8_t io_buffer[1]; uint8_t io_buffer[1];
} DynBuffer; } DynBuffer;
static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size) static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
{ {
DynBuffer *d = opaque; DynBuffer *d = opaque;
int new_size, new_allocated_size; int new_size, new_allocated_size;
...@@ -627,28 +639,32 @@ static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size) ...@@ -627,28 +639,32 @@ static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
if (new_allocated_size > d->allocated_size) { if (new_allocated_size > d->allocated_size) {
d->buffer = av_realloc(d->buffer, new_allocated_size); d->buffer = av_realloc(d->buffer, new_allocated_size);
if(d->buffer == NULL) if(d->buffer == NULL)
return ; return -1234;
d->allocated_size = new_allocated_size; d->allocated_size = new_allocated_size;
} }
memcpy(d->buffer + d->pos, buf, buf_size); memcpy(d->buffer + d->pos, buf, buf_size);
d->pos = new_size; d->pos = new_size;
if (d->pos > d->size) if (d->pos > d->size)
d->size = d->pos; d->size = d->pos;
return buf_size;
} }
static void dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size) static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size)
{ {
unsigned char buf1[4]; unsigned char buf1[4];
int ret;
/* packetized write: output the header */ /* packetized write: output the header */
buf1[0] = (buf_size >> 24); buf1[0] = (buf_size >> 24);
buf1[1] = (buf_size >> 16); buf1[1] = (buf_size >> 16);
buf1[2] = (buf_size >> 8); buf1[2] = (buf_size >> 8);
buf1[3] = (buf_size); buf1[3] = (buf_size);
dyn_buf_write(opaque, buf1, 4); ret= dyn_buf_write(opaque, buf1, 4);
if(ret < 0)
return ret;
/* then the data */ /* then the data */
dyn_buf_write(opaque, buf, buf_size); return dyn_buf_write(opaque, buf, buf_size);
} }
static int dyn_buf_seek(void *opaque, offset_t offset, int whence) static int dyn_buf_seek(void *opaque, offset_t offset, int whence)
......
...@@ -1996,11 +1996,16 @@ static void truncate_ts(AVStream *st, AVPacket *pkt){ ...@@ -1996,11 +1996,16 @@ static void truncate_ts(AVStream *st, AVPacket *pkt){
*/ */
int av_write_frame(AVFormatContext *s, AVPacket *pkt) int av_write_frame(AVFormatContext *s, AVPacket *pkt)
{ {
int ret;
compute_pkt_fields2(s->streams[pkt->stream_index], pkt); compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
truncate_ts(s->streams[pkt->stream_index], pkt); truncate_ts(s->streams[pkt->stream_index], pkt);
return s->oformat->write_packet(s, pkt); ret= s->oformat->write_packet(s, pkt);
if(!ret)
ret= url_ferror(&s->pb);
return ret;
} }
/** /**
...@@ -2111,6 +2116,8 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){ ...@@ -2111,6 +2116,8 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
if(ret<0) if(ret<0)
return ret; return ret;
if(url_ferror(&s->pb))
return url_ferror(&s->pb);
} }
} }
...@@ -2139,10 +2146,14 @@ int av_write_trailer(AVFormatContext *s) ...@@ -2139,10 +2146,14 @@ int av_write_trailer(AVFormatContext *s)
if(ret<0) if(ret<0)
goto fail; goto fail;
if(url_ferror(&s->pb))
goto fail;
} }
ret = s->oformat->write_trailer(s); ret = s->oformat->write_trailer(s);
fail: fail:
if(ret == 0)
ret=url_ferror(&s->pb);
for(i=0;i<s->nb_streams;i++) for(i=0;i<s->nb_streams;i++)
av_freep(&s->streams[i]->priv_data); av_freep(&s->streams[i]->priv_data);
av_freep(&s->priv_data); av_freep(&s->priv_data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment