diff --git a/ffmpeg.c b/ffmpeg.c index cdc265328c..31a8acbb5b 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -86,7 +86,7 @@ static AVImageFormat *image_format; static int frame_width = 0; static int frame_height = 0; static float frame_aspect_ratio = 0; -static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P; +static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE; static int frame_padtop = 0; static int frame_padbottom = 0; static int frame_padleft = 0; diff --git a/libavcodec/asv1.c b/libavcodec/asv1.c index 4ab2518ab7..13976db619 100644 --- a/libavcodec/asv1.c +++ b/libavcodec/asv1.c @@ -557,6 +557,7 @@ static int decode_init(AVCodecContext *avctx){ common_init(avctx); init_vlcs(a); ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab); + avctx->pix_fmt= PIX_FMT_YUV420P; a->inv_qscale= ((uint8_t*)avctx->extradata)[0]; if(a->inv_qscale == 0){ diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 8e6b2c0738..9efb95ee0a 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -17,7 +17,7 @@ extern "C" { #define FFMPEG_VERSION_INT 0x000409 #define FFMPEG_VERSION "0.4.9-pre1" -#define LIBAVCODEC_BUILD 4752 +#define LIBAVCODEC_BUILD 4753 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -206,6 +206,7 @@ enum CodecType { * to run on the IBM VGA graphics adapter use 6-bit palette components. */ enum PixelFormat { + PIX_FMT_NONE= -1, PIX_FMT_YUV420P, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples) PIX_FMT_YUV422, ///< Packed pixel, Y0 Cb Y1 Cr PIX_FMT_RGB24, ///< Packed pixel, 3 bytes per pixel, RGBRGB... diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index c5068c5685..8183391e93 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -560,7 +560,9 @@ static int rv10_decode_init(AVCodecContext *avctx) if(avctx->debug & FF_DEBUG_PICT_INFO){ av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1); } - + + avctx->pix_fmt = PIX_FMT_YUV420P; + if (MPV_common_init(s) < 0) return -1; @@ -576,8 +578,6 @@ static int rv10_decode_init(AVCodecContext *avctx) rv_chrom_code, 2, 2, 1); done = 1; } - - avctx->pix_fmt = PIX_FMT_YUV420P; return 0; } diff --git a/libavcodec/snow.c b/libavcodec/snow.c index a79cb1ad6e..e34cbac0f3 100644 --- a/libavcodec/snow.c +++ b/libavcodec/snow.c @@ -3652,6 +3652,8 @@ static int decode_init(AVCodecContext *avctx) { SnowContext *s = avctx->priv_data; int block_size; + + avctx->pix_fmt= PIX_FMT_YUV420P; common_init(avctx); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index afff2f98a8..f675ce8831 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -459,6 +459,7 @@ void avcodec_get_context_defaults(AVCodecContext *s){ s->profile= FF_PROFILE_UNKNOWN; s->level= FF_LEVEL_UNKNOWN; s->me_penalty_compensation= 256; + s->pix_fmt= PIX_FMT_NONE; s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS; s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS; diff --git a/libavformat/img2.c b/libavformat/img2.c index 0a53a5b824..0d58604beb 100644 --- a/libavformat/img2.c +++ b/libavformat/img2.c @@ -222,7 +222,7 @@ static int img_read_header(AVFormatContext *s1, AVFormatParameters *ap) st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_id = av_str2id(img_tags, s->path); } - if(st->codec.codec_type == CODEC_TYPE_VIDEO && ap->pix_fmt) + if(st->codec.codec_type == CODEC_TYPE_VIDEO && ap->pix_fmt != PIX_FMT_NONE) st->codec.pix_fmt = ap->pix_fmt; return 0; diff --git a/libavformat/utils.c b/libavformat/utils.c index 97b060daa6..cb43df4ece 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1682,7 +1682,7 @@ static int has_codec_parameters(AVCodecContext *enc) val = enc->sample_rate; break; case CODEC_TYPE_VIDEO: - val = enc->width; + val = enc->width && enc->pix_fmt != PIX_FMT_NONE; break; default: val = 1; @@ -1704,6 +1704,8 @@ static int try_decode_frame(AVStream *st, const uint8_t *data, int size) ret = avcodec_open(&st->codec, codec); if (ret < 0) return ret; + + if(!has_codec_parameters(&st->codec)){ switch(st->codec.codec_type) { case CODEC_TYPE_VIDEO: ret = avcodec_decode_video(&st->codec, &picture, @@ -1720,6 +1722,7 @@ static int try_decode_frame(AVStream *st, const uint8_t *data, int size) default: break; } + } fail: avcodec_close(&st->codec); return ret; @@ -1739,6 +1742,7 @@ static int try_decode_frame(AVStream *st, const uint8_t *data, int size) * * @param ic media file handle * @return >=0 if OK. AVERROR_xxx if error. + * @todo let user decide somehow what information is needed so we dont waste time geting stuff the user doesnt need */ int av_find_stream_info(AVFormatContext *ic) { @@ -1841,7 +1845,7 @@ int av_find_stream_info(AVFormatContext *ic) decompress the frame. We try to avoid that in most cases as it takes longer and uses more memory. For MPEG4, we need to decompress for Quicktime. */ - if (!has_codec_parameters(&st->codec) && + if (!has_codec_parameters(&st->codec) /*&& (st->codec.codec_id == CODEC_ID_FLV1 || st->codec.codec_id == CODEC_ID_H264 || st->codec.codec_id == CODEC_ID_H263 || @@ -1855,7 +1859,7 @@ int av_find_stream_info(AVFormatContext *ic) st->codec.codec_id == CODEC_ID_PBM || st->codec.codec_id == CODEC_ID_PPM || st->codec.codec_id == CODEC_ID_SHORTEN || - (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing))) + (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/) try_decode_frame(st, pkt->data, pkt->size); if (st->codec_info_duration >= MAX_STREAM_DURATION) { diff --git a/tests/regression.sh b/tests/regression.sh index 853b335a7e..e624b68d26 100755 --- a/tests/regression.sh +++ b/tests/regression.sh @@ -290,7 +290,7 @@ file=${outfile}huffyuv.avi do_ffmpeg $file -y -f pgmyuv -i $raw_src -an -vcodec huffyuv -pix_fmt yuv422p $file # huffyuv decoding -do_ffmpeg $raw_dst -y -i $file -f rawvideo -strict -1 $raw_dst +do_ffmpeg $raw_dst -y -i $file -f rawvideo -strict -1 -pix_fmt yuv420p $raw_dst fi ################################### @@ -370,7 +370,7 @@ file=${outfile}mjpeg.avi do_ffmpeg $file -y -qscale 10 -f pgmyuv -i $raw_src -an -vcodec mjpeg -pix_fmt yuvj420p $file # mjpeg decoding -do_ffmpeg $raw_dst -y -i $file -f rawvideo $raw_dst +do_ffmpeg $raw_dst -y -i $file -f rawvideo -pix_fmt yuv420p $raw_dst fi ################################### @@ -467,7 +467,7 @@ file=${outfile}svq1.mov do_ffmpeg $file -y -f pgmyuv -i $raw_src -an -vcodec svq1 -qscale 3 -pix_fmt yuv410p $file # svq1 decoding -do_ffmpeg $raw_dst -y -i $file -f rawvideo $raw_dst +do_ffmpeg $raw_dst -y -i $file -f rawvideo -pix_fmt yuv420p $raw_dst fi ###################################