From: Michael Niedermayer Date: Fri, 8 Nov 2002 18:35:39 +0000 (+0000) Subject: cleanup (breaks compatibility, requested by fabrice) X-Git-Tag: v0.5~17080 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d7425f59d5fc01bccde90cccd42ba592961b2d03;p=platform%2Fupstream%2Flibav.git cleanup (breaks compatibility, requested by fabrice) remove CODEC_FLAG_NOT_TRUNCATED & add CODEC_FLAG_TRUNCATED add CODEC_CAP_TRUNCATED add alpha plane to AVPicture remove CODEC_ID_MSMPEG4 remove various unused stuff support "truncated" mpeg4 streams Originally committed as revision 1175 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/ffmpeg.c b/ffmpeg.c index 00809c6..59999b8 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -1854,6 +1854,11 @@ void opt_input_file(const char *filename) enc->error_resilience = error_resilience; enc->error_concealment = error_concealment; enc->idct_algo= idct_algo; +/* if(enc->codec->capabilities & CODEC_CAP_TRUNCATED) + enc->flags|= CODEC_FLAG_TRUNCATED; */ + if(/*enc->codec_id==CODEC_ID_MPEG4 || */enc->codec_id==CODEC_ID_MPEG1VIDEO) + enc->flags|= CODEC_FLAG_TRUNCATED; + if (enc->frame_rate != rfps) { fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n", i, (float)enc->frame_rate / FRAME_RATE_BASE, diff --git a/libav/asf.c b/libav/asf.c index 74d092a..4f82e65 100644 --- a/libav/asf.c +++ b/libav/asf.c @@ -1224,7 +1224,7 @@ AVOutputFormat asf_oformat = { #else CODEC_ID_MP2, #endif - CODEC_ID_MSMPEG4, + CODEC_ID_MSMPEG4V3, asf_write_header, asf_write_packet, asf_write_trailer, @@ -1241,7 +1241,7 @@ AVOutputFormat asf_stream_oformat = { #else CODEC_ID_MP2, #endif - CODEC_ID_MSMPEG4, + CODEC_ID_MSMPEG4V3, asf_write_stream_header, asf_write_packet, asf_write_trailer, diff --git a/libav/avienc.c b/libav/avienc.c index 370fa3e..561c88c 100644 --- a/libav/avienc.c +++ b/libav/avienc.c @@ -418,7 +418,7 @@ static AVOutputFormat avi_oformat = { "avi", sizeof(AVIContext), CODEC_ID_MP2, - CODEC_ID_MSMPEG4, + CODEC_ID_MSMPEG4V3, avi_write_header, avi_write_packet, avi_write_trailer, diff --git a/libav/utils.c b/libav/utils.c index 8a609a9..0c12561 100644 --- a/libav/utils.c +++ b/libav/utils.c @@ -536,6 +536,9 @@ int av_find_stream_info(AVFormatContext *ic) st->codec_info_state = CSTATE_FOUND; codec = avcodec_find_decoder(st->codec.codec_id); if (codec) { + if(codec->capabilities & CODEC_CAP_TRUNCATED) + st->codec.flags |= CODEC_FLAG_TRUNCATED; + ret = avcodec_open(&st->codec, codec); if (ret >= 0) st->codec_info_state = CSTATE_DECODING; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 4493407..dabb9c6 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -5,8 +5,8 @@ #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4634 -#define LIBAVCODEC_BUILD_STR "4634" +#define LIBAVCODEC_BUILD 4635 +#define LIBAVCODEC_BUILD_STR "4635" enum CodecID { CODEC_ID_NONE, @@ -50,7 +50,6 @@ enum CodecID { CODEC_ID_ADPCM_IMA_WAV, CODEC_ID_ADPCM_MS, }; -#define CODEC_ID_MSMPEG4 CODEC_ID_MSMPEG4V3 enum CodecType { CODEC_TYPE_UNKNOWN = -1, @@ -80,6 +79,12 @@ enum SampleFormat { /* in bytes */ #define AVCODEC_MAX_AUDIO_FRAME_SIZE 131072 +/** + * Required number of zero bytes at the end of the input bitstream for decoding. + * to avoid overreading (and possibly segfaulting) + */ +#define FF_INPUT_BUFFER_PADDING_SIZE 8 + /* motion estimation type, EPZS by default */ enum Motion_Est_ID { ME_ZERO = 1, @@ -128,8 +133,8 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, #define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */ #define CODEC_FLAG_EMU_EDGE 0x4000/* dont draw edges */ #define CODEC_FLAG_DR1 0x8000 /* direct renderig type 1 (store internal frames in external buffers) */ -#define CODEC_FLAG_NOT_TRUNCATED 0x00010000 /* input bitstream is not truncated, except before a startcode - allows the last part of a frame to be decoded earlier */ +#define CODEC_FLAG_TRUNCATED 0x00010000 /* input bitstream might be truncated at a random location instead + of only at frame boundaries */ #define CODEC_FLAG_NORMALIZE_AQP 0x00020000 /* normalize adaptive quantization */ #define CODEC_FLAG_INTERLACED_DCT 0x00040000 /* use interlaced dct */ #define CODEC_FLAG_LOW_DELAY 0x00080000 /* force low delay / will fail on b frames */ @@ -141,6 +146,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, /* if 'parse_only' field is true, then avcodec_parse_frame() can be used */ #define CODEC_CAP_PARSE_ONLY 0x0004 +#define CODEC_CAP_TRUNCATED 0x0008 #define FRAME_RATE_BASE 10000 @@ -770,10 +776,13 @@ typedef struct AVCodec { struct AVCodec *next; } AVCodec; -/* three components are given, that's all */ +/** + * four components are given, that's all. + * the last component is alpha + */ typedef struct AVPicture { - UINT8 *data[3]; - int linesize[3]; + UINT8 *data[4]; + int linesize[4]; } AVPicture; extern AVCodec ac3_encoder; @@ -925,13 +934,6 @@ void avcodec_register_all(void); void avcodec_flush_buffers(AVCodecContext *avctx); -// deprecated / obsolete stuff, WILL be removed -#ifndef MBC -#define MBC 128 -#define MBR 96 -#endif -#define QP_TYPE int - /** * Interface for 0.5.0 version * diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index 490a5d7..8386fcf 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -125,9 +125,14 @@ static int h263_decode_end(AVCodecContext *avctx) */ static int get_consumed_bytes(MpegEncContext *s, int buf_size){ int pos= (get_bits_count(&s->gb)+7)>>3; + if(s->divx_version>=500){ //we would have to scan through the whole buf to handle the weird reordering ... return buf_size; + }else if(s->flags&CODEC_FLAG_TRUNCATED){ + pos -= s->parse_context.last_index; + if(pos<0) pos=0; // padding is not really read so this might be -1 + return pos; }else{ if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...) if(pos+10>buf_size) pos=buf_size; // oops ;) @@ -299,6 +304,43 @@ static int decode_slice(MpegEncContext *s){ return -1; } +/** + * finds the end of the current frame in the bitstream. + * @return the position of the first byte of the next frame, or -1 + */ +static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){ + ParseContext *pc= &s->parse_context; + int vop_found, i; + uint32_t state; + + vop_found= pc->frame_start_found; + state= pc->state; + + i=0; + if(!vop_found){ + for(i=0; iframe_start_found=0; + pc->state=-1; + return i-3; + } + } + pc->frame_start_found= vop_found; + pc->state= state; + return -1; +} + static int h263_decode_frame(AVCodecContext *avctx, void *data, int *data_size, UINT8 *buf, int buf_size) @@ -325,6 +367,42 @@ uint64_t time= rdtsc(); if (buf_size == 0) { return 0; } + + if(s->flags&CODEC_FLAG_TRUNCATED){ + int next; + ParseContext *pc= &s->parse_context; + + pc->last_index= pc->index; + + if(s->codec_id==CODEC_ID_MPEG4){ + next= mpeg4_find_frame_end(s, buf, buf_size); + }else{ + fprintf(stderr, "this codec doesnt support truncated bitstreams\n"); + return -1; + } + if(next==-1){ + if(buf_size + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){ + pc->buffer_size= buf_size + pc->index + 10*1024; + pc->buffer= realloc(pc->buffer, pc->buffer_size); + } + + memcpy(&pc->buffer[pc->index], buf, buf_size); + pc->index += buf_size; + return buf_size; + } + + if(pc->index){ + if(next + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){ + pc->buffer_size= next + pc->index + 10*1024; + pc->buffer= realloc(pc->buffer, pc->buffer_size); + } + + memcpy(&pc->buffer[pc->index], buf, next + FF_INPUT_BUFFER_PADDING_SIZE ); + pc->index = 0; + buf= pc->buffer; + buf_size= pc->last_index + next; + } + } retry: @@ -627,7 +705,7 @@ AVCodec mpeg4_decoder = { NULL, h263_decode_end, h263_decode_frame, - CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED, }; AVCodec h263_decoder = { diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index a435fe8..f0dfd19 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1876,7 +1876,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx, } else { memcpy(s->buf_ptr, buf_start, len); s->buf_ptr += len; - if( (s2->flags&CODEC_FLAG_NOT_TRUNCATED) && (!start_code_found) + if( (!(s2->flags&CODEC_FLAG_TRUNCATED)) && (!start_code_found) && s->buf_ptr+4buffer+s->buffer_size){ start_code_found= 1; code= 0x1FF; @@ -1971,5 +1971,5 @@ AVCodec mpeg_decoder = { NULL, mpeg_decode_end, mpeg_decode_frame, - CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED, }; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 2f6a425..5ca2727 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -445,6 +445,8 @@ int MPV_common_init(MpegEncContext *s) s->block= s->blocks[0]; + s->parse_context.state= -1; + s->context_initialized = 1; return 0; fail: diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 631db89..a61ae62 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -109,6 +109,15 @@ typedef struct ScanTable{ #endif } ScanTable; +typedef struct ParseContext{ + UINT8 *buffer; + int index; + int last_index; + int buffer_size; + int state; + int frame_start_found; +} ParseContext; + typedef struct MpegEncContext { struct AVCodecContext *avctx; /* the following parameters must be initialized before encoding */ @@ -351,6 +360,8 @@ typedef struct MpegEncContext { int mb_num_left; /* number of MBs left in this video packet (for partitioned Slices only)*/ int next_p_frame_damaged; /* set if the next p frame is damaged, to avoid showing trashed b frames */ int error_resilience; + + ParseContext parse_context; /* H.263 specific */ int gob_number;