On 09/29/2011 08:15 AM, [email protected] wrote: > From: Benjamin Larsson <[email protected]> > > --- > libavcodec/asv1.c | 6 ++++-- > libavcodec/avcodec.h | 4 ++++ > libavcodec/dnxhddec.c | 2 +- > libavcodec/dv.c | 4 ++-- > libavcodec/huffyuv.c | 5 +++-- > libavcodec/libopenjpeg.c | 2 +- > libavcodec/ljpegenc.c | 1 + > libavcodec/mjpegbdec.c | 2 +- > libavcodec/mjpegdec.c | 2 +- > libavcodec/proresdec.c | 2 +- > libavcodec/rawdec.c | 1 + > libavcodec/rawenc.c | 1 + > libavcodec/vcr1.c | 3 ++- > libavformat/utils.c | 29 ++--------------------------- > 14 files changed, 25 insertions(+), 39 deletions(-) > > diff --git a/libavcodec/asv1.c b/libavcodec/asv1.c > index 97c5e68..924a5ad 100644 > --- a/libavcodec/asv1.c > +++ b/libavcodec/asv1.c > @@ -610,7 +610,7 @@ AVCodec ff_asv1_decoder = { > .init = decode_init, > .close = decode_end, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .long_name= NULL_IF_CONFIG_SMALL("ASUS V1"), > }; > > @@ -622,7 +622,7 @@ AVCodec ff_asv2_decoder = { > .init = decode_init, > .close = decode_end, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .long_name= NULL_IF_CONFIG_SMALL("ASUS V2"), > }; > > @@ -635,6 +635,7 @@ AVCodec ff_asv1_encoder = { > .init = encode_init, > .encode = encode_frame, > //encode_end, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, > .long_name= NULL_IF_CONFIG_SMALL("ASUS V1"), > }; > @@ -649,6 +650,7 @@ AVCodec ff_asv2_encoder = { > .init = encode_init, > .encode = encode_frame, > //encode_end, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, > .long_name= NULL_IF_CONFIG_SMALL("ASUS V2"), > }; > diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h > index 4d61f44..38c35a8 100644 > --- a/libavcodec/avcodec.h > +++ b/libavcodec/avcodec.h > @@ -711,6 +711,10 @@ typedef struct RcOverride{ > * Codec supports slice-based (or partition-based) multithreading. > */ > #define CODEC_CAP_SLICE_THREADS 0x2000 > +/** > + * Codec is intra only > + */ > +#define CODEC_CAP_INTRA_ONLY 0x4000 > > //The following defines may change, don't expect compatibility if you use > them. > #define MB_TYPE_INTRA4x4 0x0001 > diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c > index 7198a2f..ae5e558 100644 > --- a/libavcodec/dnxhddec.c > +++ b/libavcodec/dnxhddec.c > @@ -399,6 +399,6 @@ AVCodec ff_dnxhd_decoder = { > .init = dnxhd_decode_init, > .close = dnxhd_decode_close, > .decode = dnxhd_decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"), > }; > diff --git a/libavcodec/dv.c b/libavcodec/dv.c > index 9762422..bfefbc2 100644 > --- a/libavcodec/dv.c > +++ b/libavcodec/dv.c > @@ -1285,7 +1285,7 @@ AVCodec ff_dvvideo_encoder = { > .priv_data_size = sizeof(DVVideoContext), > .init = dvvideo_init_encoder, > .encode = dvvideo_encode_frame, > - .capabilities = CODEC_CAP_SLICE_THREADS, > + .capabilities = CODEC_CAP_SLICE_THREADS | CODEC_CAP_INTRA_ONLY, > .pix_fmts = (const enum PixelFormat[]) {PIX_FMT_YUV411P, > PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, > .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), > }; > @@ -1300,7 +1300,7 @@ AVCodec ff_dvvideo_decoder = { > .init = dvvideo_init, > .close = dvvideo_close, > .decode = dvvideo_decode_frame, > - .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS | > CODEC_CAP_INTRA_ONLY, > .max_lowres = 3, > .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), > }; > diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c > index 865bc6a..341ce0e 100644 > --- a/libavcodec/huffyuv.c > +++ b/libavcodec/huffyuv.c > @@ -1442,7 +1442,7 @@ AVCodec ff_huffyuv_decoder = { > .init = decode_init, > .close = decode_end, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | > CODEC_CAP_FRAME_THREADS, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | > CODEC_CAP_FRAME_THREADS | CODEC_CAP_INTRA_ONLY, > .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), > .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"), > }; > @@ -1457,7 +1457,7 @@ AVCodec ff_ffvhuff_decoder = { > .init = decode_init, > .close = decode_end, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | > CODEC_CAP_FRAME_THREADS, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | > CODEC_CAP_FRAME_THREADS | CODEC_CAP_INTRA_ONLY, > .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), > .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"), > }; > @@ -1486,6 +1486,7 @@ AVCodec ff_ffvhuff_encoder = { > .init = encode_init, > .encode = encode_frame, > .close = encode_end, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, > PIX_FMT_RGB32, PIX_FMT_NONE}, > .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"), > }; > diff --git a/libavcodec/libopenjpeg.c b/libavcodec/libopenjpeg.c > index 42809b9..4f1580c 100644 > --- a/libavcodec/libopenjpeg.c > +++ b/libavcodec/libopenjpeg.c > @@ -192,7 +192,7 @@ AVCodec ff_libopenjpeg_decoder = { > .init = libopenjpeg_decode_init, > .close = libopenjpeg_decode_close, > .decode = libopenjpeg_decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .max_lowres = 5, > .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG based JPEG 2000 > decoder"), > }; > diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c > index 6a90338..6f57b2a 100644 > --- a/libavcodec/ljpegenc.c > +++ b/libavcodec/ljpegenc.c > @@ -194,5 +194,6 @@ AVCodec ff_ljpeg_encoder = { //FIXME avoid MPV_* lossless > JPEG should not need t > .init = MPV_encode_init, > .encode = encode_picture_lossless, > .close = MPV_encode_end, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("Lossless JPEG"), > }; > diff --git a/libavcodec/mjpegbdec.c b/libavcodec/mjpegbdec.c > index a9f94f1..4968736 100644 > --- a/libavcodec/mjpegbdec.c > +++ b/libavcodec/mjpegbdec.c > @@ -157,7 +157,7 @@ AVCodec ff_mjpegb_decoder = { > .init = ff_mjpeg_decode_init, > .close = ff_mjpeg_decode_end, > .decode = mjpegb_decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .max_lowres = 3, > .long_name = NULL_IF_CONFIG_SMALL("Apple MJPEG-B"), > }; > diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c > index 168cc0b..0d044ac 100644 > --- a/libavcodec/mjpegdec.c > +++ b/libavcodec/mjpegdec.c > @@ -1624,7 +1624,7 @@ AVCodec ff_mjpeg_decoder = { > .init = ff_mjpeg_decode_init, > .close = ff_mjpeg_decode_end, > .decode = ff_mjpeg_decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .max_lowres = 3, > .long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"), > .priv_class = &mjpegdec_class, > diff --git a/libavcodec/proresdec.c b/libavcodec/proresdec.c > index 759c10b..e82f67f 100644 > --- a/libavcodec/proresdec.c > +++ b/libavcodec/proresdec.c > @@ -726,6 +726,6 @@ AVCodec ff_prores_decoder = { > .init = decode_init, > .close = decode_close, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("Apple ProRes (iCodec Pro)") > }; > diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c > index 9989a36..aaaa569 100644 > --- a/libavcodec/rawdec.c > +++ b/libavcodec/rawdec.c > @@ -209,5 +209,6 @@ AVCodec ff_rawvideo_decoder = { > .init = raw_init_decoder, > .close = raw_close_decoder, > .decode = raw_decode, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("raw video"), > }; > diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c > index 6640db0..73e9a35 100644 > --- a/libavcodec/rawenc.c > +++ b/libavcodec/rawenc.c > @@ -62,5 +62,6 @@ AVCodec ff_rawvideo_encoder = { > .priv_data_size = sizeof(AVFrame), > .init = raw_init_encoder, > .encode = raw_encode, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("raw video"), > }; > diff --git a/libavcodec/vcr1.c b/libavcodec/vcr1.c > index f745089..5be240e 100644 > --- a/libavcodec/vcr1.c > +++ b/libavcodec/vcr1.c > @@ -184,7 +184,7 @@ AVCodec ff_vcr1_decoder = { > .init = decode_init, > .close = decode_end, > .decode = decode_frame, > - .capabilities = CODEC_CAP_DR1, > + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("ATI VCR1"), > }; > > @@ -196,6 +196,7 @@ AVCodec ff_vcr1_encoder = { > .priv_data_size = sizeof(VCR1Context), > .init = encode_init, > .encode = encode_frame, > + .capabilities = CODEC_CAP_INTRA_ONLY, > .long_name = NULL_IF_CONFIG_SMALL("ATI VCR1"), > }; > #endif > diff --git a/libavformat/utils.c b/libavformat/utils.c > index d0ad358..56ebcc8 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -844,31 +844,6 @@ static void compute_frame_duration(int *pnum, int *pden, > AVStream *st, > } > } > > -static int is_intra_only(AVCodecContext *enc){ > - if(enc->codec_type == AVMEDIA_TYPE_AUDIO){ > - return 1; > - }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){ > - switch(enc->codec_id){ > - case CODEC_ID_MJPEG: > - case CODEC_ID_MJPEGB: > - case CODEC_ID_LJPEG: > - case CODEC_ID_PRORES: > - case CODEC_ID_RAWVIDEO: > - case CODEC_ID_DVVIDEO: > - case CODEC_ID_HUFFYUV: > - case CODEC_ID_FFVHUFF: > - case CODEC_ID_ASV1: > - case CODEC_ID_ASV2: > - case CODEC_ID_VCR1: > - case CODEC_ID_DNXHD: > - case CODEC_ID_JPEG2000: > - return 1; > - default: break; > - } > - } > - return 0; > -} > - > static void update_initial_timestamps(AVFormatContext *s, int stream_index, > int64_t dts, int64_t pts) > { > @@ -1083,8 +1058,8 @@ static void compute_pkt_fields(AVFormatContext *s, > AVStream *st, > // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", > dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, > pkt->dts, st->cur_dts); > > /* update flags */ > - if(is_intra_only(st->codec)) > - pkt->flags |= AV_PKT_FLAG_KEY; > + if (st->codec->codec->capabilities & CODEC_CAP_INTRA_ONLY) > + pkt->flags |= AV_PKT_FLAG_KEY; /* If the codec is an intra codec > always set the keyframe flag */ > else if (pc) { > pkt->flags = 0; > /* keyframe computation */
Is st->codec->codec always non-NULL here? -Justin _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
