* qatar/master: APIChanges: document git revision for CODEC_CAP_SLICE_THREADS addition. Introduce slice threads flag. FATE: allow forcing thread-type when doing threaded fate runs. Use av_log_ask_for_sample() where appropriate. error: sort, pack, and align error code and string definitions The stabilization period after version bumps should be one month, not one week. applehttp: Expose the stream bitrate via metadata doc: Add some initial docs on the applehttp demuxer Provide a fallback version of the libm function trunc libavdevice: Define _XOPEN_SOURCE for usleep lavc: provide deprecated avcodec_thread_init until next major version lavc: provide the opt.h header until the next bump error: change AVERROR_EOF value error: remove AVERROR_NUMEXPECTED error: add error code AVERROR_OPTION_NOT_FOUND, and use it in opt.c Conflicts: libavcodec/h264.c libavutil/error.c libavutil/error.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.8
| @@ -291,7 +291,7 @@ fate: $(FATE) | |||||
| $(FATE): ffmpeg$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF)) | $(FATE): ffmpeg$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF)) | ||||
| @echo "TEST $(@:fate-%=%)" | @echo "TEST $(@:fate-%=%)" | ||||
| $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' | |||||
| $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' | |||||
| fate-list: | fate-list: | ||||
| @printf '%s\n' $(sort $(FATE)) | @printf '%s\n' $(sort $(FATE)) | ||||
| @@ -1128,6 +1128,7 @@ HAVE_LIST=" | |||||
| ten_operands | ten_operands | ||||
| termios_h | termios_h | ||||
| threads | threads | ||||
| trunc | |||||
| truncf | truncf | ||||
| vfp_args | vfp_args | ||||
| VirtualAlloc | VirtualAlloc | ||||
| @@ -2887,6 +2888,7 @@ check_mathfunc lrint | |||||
| check_mathfunc lrintf | check_mathfunc lrintf | ||||
| check_mathfunc round | check_mathfunc round | ||||
| check_mathfunc roundf | check_mathfunc roundf | ||||
| check_mathfunc trunc | |||||
| check_mathfunc truncf | check_mathfunc truncf | ||||
| # these are off by default, so fail if requested and not available | # these are off by default, so fail if requested and not available | ||||
| @@ -1,5 +1,6 @@ | |||||
| Never assume the API of libav* to be stable unless at least 1 week has passed since | |||||
| the last major version increase. | |||||
| Never assume the API of libav* to be stable unless at least 1 month has passed | |||||
| since the last major version increase. | |||||
| The last version increases were: | The last version increases were: | ||||
| libavcodec: 2011-04-18 | libavcodec: 2011-04-18 | ||||
| libavdevice: 2011-04-18 | libavdevice: 2011-04-18 | ||||
| @@ -12,6 +13,9 @@ libavutil: 2011-04-18 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2011-04-21 - 94f7451 - lavc 53.1.0 - avcodec.h | |||||
| Add CODEC_CAP_SLICE_THREADS for codecs supporting sliced threading. | |||||
| 2011-04-15 - lavc 52.120.0 - avcodec.h | 2011-04-15 - lavc 52.120.0 - avcodec.h | ||||
| AVPacket structure got additional members for passing side information: | AVPacket structure got additional members for passing side information: | ||||
| 4de339e introduce side information for AVPacket | 4de339e introduce side information for AVPacket | ||||
| @@ -64,4 +64,15 @@ Note that the pattern must not necessarily contain "%d" or | |||||
| ffmpeg -f image2 -i img.jpeg img.png | ffmpeg -f image2 -i img.jpeg img.png | ||||
| @end example | @end example | ||||
| @section applehttp | |||||
| Apple HTTP Live Streaming demuxer. | |||||
| This demuxer presents all AVStreams from all variant streams. | |||||
| The id field is set to the bitrate variant index number. By setting | |||||
| the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay), | |||||
| the caller can decide which variant streams to actually receive. | |||||
| The total bitrate of the variant that the stream belongs to is | |||||
| available in a metadata key named "variant_bitrate". | |||||
| @c man end INPUT DEVICES | @c man end INPUT DEVICES | ||||
| @@ -3852,7 +3852,7 @@ static void opt_output_file(const char *filename) | |||||
| /* check filename in case of an image number is expected */ | /* check filename in case of an image number is expected */ | ||||
| if (oc->oformat->flags & AVFMT_NEEDNUMBER) { | if (oc->oformat->flags & AVFMT_NEEDNUMBER) { | ||||
| if (!av_filename_number_test(oc->filename)) { | if (!av_filename_number_test(oc->filename)) { | ||||
| print_error(oc->filename, AVERROR_NUMEXPECTED); | |||||
| print_error(oc->filename, AVERROR(EINVAL)); | |||||
| ffmpeg_exit(1); | ffmpeg_exit(1); | ||||
| } | } | ||||
| } | } | ||||
| @@ -3,7 +3,7 @@ include $(SUBDIR)../config.mak | |||||
| NAME = avcodec | NAME = avcodec | ||||
| FFLIBS = avutil | FFLIBS = avutil | ||||
| HEADERS = avcodec.h avfft.h dxva2.h vaapi.h vdpau.h version.h xvmc.h | |||||
| HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h version.h xvmc.h | |||||
| OBJS = allcodecs.o \ | OBJS = allcodecs.o \ | ||||
| audioconvert.o \ | audioconvert.o \ | ||||
| @@ -680,6 +680,10 @@ typedef struct RcOverride{ | |||||
| * Codec supports frame-level multithreading. | * Codec supports frame-level multithreading. | ||||
| */ | */ | ||||
| #define CODEC_CAP_FRAME_THREADS 0x1000 | #define CODEC_CAP_FRAME_THREADS 0x1000 | ||||
| /** | |||||
| * Codec supports slice-based (or partition-based) multithreading. | |||||
| */ | |||||
| #define CODEC_CAP_SLICE_THREADS 0x2000 | |||||
| //The following defines may change, don't expect compatibility if you use them. | //The following defines may change, don't expect compatibility if you use them. | ||||
| #define MB_TYPE_INTRA4x4 0x0001 | #define MB_TYPE_INTRA4x4 0x0001 | ||||
| @@ -3633,6 +3637,14 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, | |||||
| enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt); | enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt); | ||||
| #if FF_API_THREAD_INIT | |||||
| /** | |||||
| * @deprecated Set s->thread_count before calling avcodec_open() instead of calling this. | |||||
| */ | |||||
| attribute_deprecated | |||||
| int avcodec_thread_init(AVCodecContext *s, int thread_count); | |||||
| #endif | |||||
| int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); | int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); | ||||
| int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | ||||
| //FIXME func typedef | //FIXME func typedef | ||||
| @@ -1136,7 +1136,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| switch (q->subpacket[s].cookversion) { | switch (q->subpacket[s].cookversion) { | ||||
| case MONO: | case MONO: | ||||
| if (q->nb_channels != 1) { | if (q->nb_channels != 1) { | ||||
| av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "Container channels != 1.!\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| av_log(avctx,AV_LOG_DEBUG,"MONO\n"); | av_log(avctx,AV_LOG_DEBUG,"MONO\n"); | ||||
| @@ -1150,7 +1150,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| break; | break; | ||||
| case JOINT_STEREO: | case JOINT_STEREO: | ||||
| if (q->nb_channels != 2) { | if (q->nb_channels != 2) { | ||||
| av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "Container channels != 2.\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); | av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); | ||||
| @@ -1188,7 +1188,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| break; | break; | ||||
| default: | default: | ||||
| av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "Unknown Cook version.\n"); | |||||
| return -1; | return -1; | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -1205,7 +1205,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| /* Try to catch some obviously faulty streams, othervise it might be exploitable */ | /* Try to catch some obviously faulty streams, othervise it might be exploitable */ | ||||
| if (q->subpacket[s].total_subbands > 53) { | if (q->subpacket[s].total_subbands > 53) { | ||||
| av_log(avctx,AV_LOG_ERROR,"total_subbands > 53, report sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "total_subbands > 53\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -1215,7 +1215,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| if (q->subpacket[s].subbands > 50) { | if (q->subpacket[s].subbands > 50) { | ||||
| av_log(avctx,AV_LOG_ERROR,"subbands > 50, report sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "subbands > 50\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| q->subpacket[s].gains1.now = q->subpacket[s].gain_1; | q->subpacket[s].gains1.now = q->subpacket[s].gain_1; | ||||
| @@ -1226,7 +1226,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| q->num_subpackets++; | q->num_subpackets++; | ||||
| s++; | s++; | ||||
| if (s > MAX_SUBPACKETS) { | if (s > MAX_SUBPACKETS) { | ||||
| av_log(avctx,AV_LOG_ERROR,"Too many subpackets > 5, report file!\n"); | |||||
| av_log_ask_for_sample(avctx, "Too many subpackets > 5\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -869,6 +869,7 @@ AVCodec ff_dnxhd_encoder = { | |||||
| dnxhd_encode_init, | dnxhd_encode_init, | ||||
| dnxhd_encode_picture, | dnxhd_encode_picture, | ||||
| dnxhd_encode_end, | dnxhd_encode_end, | ||||
| .capabilities = CODEC_CAP_SLICE_THREADS, | |||||
| .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_NONE}, | .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"), | .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"), | ||||
| .priv_class = &class, | .priv_class = &class, | ||||
| @@ -1297,6 +1297,7 @@ AVCodec ff_dvvideo_encoder = { | |||||
| sizeof(DVVideoContext), | sizeof(DVVideoContext), | ||||
| dvvideo_init_encoder, | dvvideo_init_encoder, | ||||
| dvvideo_encode_frame, | dvvideo_encode_frame, | ||||
| .capabilities = CODEC_CAP_SLICE_THREADS, | |||||
| .pix_fmts = (const enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, | .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)"), | .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), | ||||
| }; | }; | ||||
| @@ -1312,7 +1313,7 @@ AVCodec ff_dvvideo_decoder = { | |||||
| NULL, | NULL, | ||||
| dvvideo_close, | dvvideo_close, | ||||
| dvvideo_decode_frame, | dvvideo_decode_frame, | ||||
| CODEC_CAP_DR1, | |||||
| CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS, | |||||
| NULL, | NULL, | ||||
| .max_lowres = 3, | .max_lowres = 3, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), | .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), | ||||
| @@ -1795,7 +1795,7 @@ AVCodec ff_ffv1_decoder = { | |||||
| NULL, | NULL, | ||||
| common_end, | common_end, | ||||
| decode_frame, | decode_frame, | ||||
| CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, | |||||
| CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ | CODEC_CAP_SLICE_THREADS, | |||||
| NULL, | NULL, | ||||
| .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), | .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), | ||||
| }; | }; | ||||
| @@ -1809,6 +1809,7 @@ AVCodec ff_ffv1_encoder = { | |||||
| encode_init, | encode_init, | ||||
| encode_frame, | encode_frame, | ||||
| common_end, | common_end, | ||||
| .capabilities = CODEC_CAP_SLICE_THREADS, | |||||
| .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_NONE}, | .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_NONE}, | ||||
| .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), | .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), | ||||
| }; | }; | ||||
| @@ -3467,7 +3467,9 @@ AVCodec ff_h264_decoder = { | |||||
| NULL, | NULL, | ||||
| ff_h264_decode_end, | ff_h264_decode_end, | ||||
| decode_frame, | decode_frame, | ||||
| /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_FRAME_THREADS, | |||||
| /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY | | |||||
| CODEC_CAP_FRAME_THREADS | | |||||
| CODEC_CAP_SLICE_THREADS, | |||||
| .flush= flush_dpb, | .flush= flush_dpb, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), | .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), | ||||
| .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), | .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), | ||||
| @@ -2602,7 +2602,7 @@ AVCodec ff_mpeg2video_decoder = { | |||||
| NULL, | NULL, | ||||
| mpeg_decode_end, | mpeg_decode_end, | ||||
| mpeg_decode_frame, | mpeg_decode_frame, | ||||
| CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | |||||
| CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, | |||||
| .flush= flush, | .flush= flush, | ||||
| .max_lowres= 3, | .max_lowres= 3, | ||||
| .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"), | .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"), | ||||
| @@ -2619,7 +2619,7 @@ AVCodec ff_mpegvideo_decoder = { | |||||
| NULL, | NULL, | ||||
| mpeg_decode_end, | mpeg_decode_end, | ||||
| mpeg_decode_frame, | mpeg_decode_frame, | ||||
| CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | |||||
| CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, | |||||
| .flush= flush, | .flush= flush, | ||||
| .max_lowres= 3, | .max_lowres= 3, | ||||
| .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), | .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), | ||||
| @@ -940,7 +940,7 @@ AVCodec ff_mpeg1video_encoder = { | |||||
| MPV_encode_end, | MPV_encode_end, | ||||
| .supported_framerates= ff_frame_rate_tab+1, | .supported_framerates= ff_frame_rate_tab+1, | ||||
| .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | ||||
| .capabilities= CODEC_CAP_DELAY, | |||||
| .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, | |||||
| .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), | .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), | ||||
| }; | }; | ||||
| @@ -954,6 +954,6 @@ AVCodec ff_mpeg2video_encoder = { | |||||
| MPV_encode_end, | MPV_encode_end, | ||||
| .supported_framerates= ff_frame_rate_tab+1, | .supported_framerates= ff_frame_rate_tab+1, | ||||
| .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE}, | .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE}, | ||||
| .capabilities= CODEC_CAP_DELAY, | |||||
| .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, | |||||
| .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"), | .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"), | ||||
| }; | }; | ||||
| @@ -1359,6 +1359,6 @@ AVCodec ff_mpeg4_encoder = { | |||||
| MPV_encode_picture, | MPV_encode_picture, | ||||
| MPV_encode_end, | MPV_encode_end, | ||||
| .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | ||||
| .capabilities= CODEC_CAP_DELAY, | |||||
| .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, | |||||
| .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"), | .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"), | ||||
| }; | }; | ||||
| @@ -3802,6 +3802,7 @@ AVCodec ff_h263p_encoder = { | |||||
| MPV_encode_init, | MPV_encode_init, | ||||
| MPV_encode_picture, | MPV_encode_picture, | ||||
| MPV_encode_end, | MPV_encode_end, | ||||
| .capabilities = CODEC_CAP_SLICE_THREADS, | |||||
| .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, | ||||
| .long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"), | .long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"), | ||||
| }; | }; | ||||
| @@ -0,0 +1,16 @@ | |||||
| /** | |||||
| * @file | |||||
| * This header is provided for compatibility only and will be removed | |||||
| * on next major bump | |||||
| */ | |||||
| #ifndef AVCODEC_OPT_H | |||||
| #define AVCODEC_OPT_H | |||||
| #include "libavcodec/version.h" | |||||
| #if FF_API_OPT_H | |||||
| #include "libavutil/opt.h" | |||||
| #endif | |||||
| #endif | |||||
| @@ -877,7 +877,8 @@ static void validate_thread_parameters(AVCodecContext *avctx) | |||||
| avctx->active_thread_type = 0; | avctx->active_thread_type = 0; | ||||
| } else if (frame_threading_supported && (avctx->thread_type & FF_THREAD_FRAME)) { | } else if (frame_threading_supported && (avctx->thread_type & FF_THREAD_FRAME)) { | ||||
| avctx->active_thread_type = FF_THREAD_FRAME; | avctx->active_thread_type = FF_THREAD_FRAME; | ||||
| } else if (avctx->thread_type & FF_THREAD_SLICE) { | |||||
| } else if (avctx->codec->capabilities & CODEC_CAP_SLICE_THREADS && | |||||
| avctx->thread_type & FF_THREAD_SLICE) { | |||||
| avctx->active_thread_type = FF_THREAD_SLICE; | avctx->active_thread_type = FF_THREAD_SLICE; | ||||
| } | } | ||||
| } | } | ||||
| @@ -353,7 +353,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s) | |||||
| s->flags = FLAG_KEYFRAME; | s->flags = FLAG_KEYFRAME; | ||||
| if (s->flags & FLAG_SPRITE) { | if (s->flags & FLAG_SPRITE) { | ||||
| av_log(s->avctx, AV_LOG_INFO, "SPRITE frame found, please report the sample to the developers\n"); | |||||
| av_log_ask_for_sample(s->avctx, "SPRITE frame found.\n"); | |||||
| /* FIXME header.width, height, xoffset and yoffset aren't initialized */ | /* FIXME header.width, height, xoffset and yoffset aren't initialized */ | ||||
| #if 0 | #if 0 | ||||
| s->w = header.width; | s->w = header.width; | ||||
| @@ -370,7 +370,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s) | |||||
| if ((s->w < 213) && (s->h >= 176)) | if ((s->w < 213) && (s->h >= 176)) | ||||
| { | { | ||||
| s->flags |= FLAG_INTERPOLATED; | s->flags |= FLAG_INTERPOLATED; | ||||
| av_log(s->avctx, AV_LOG_INFO, "INTERPOLATION selected, please report the sample to the developers\n"); | |||||
| av_log_ask_for_sample(s->avctx, "INTERPOLATION selected.\n"); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -247,7 +247,7 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) | |||||
| if (s->is_float) | if (s->is_float) | ||||
| { | { | ||||
| avctx->sample_fmt = AV_SAMPLE_FMT_FLT; | avctx->sample_fmt = AV_SAMPLE_FMT_FLT; | ||||
| av_log(s->avctx, AV_LOG_ERROR, "Unsupported sample format. Please contact the developers.\n"); | |||||
| av_log_ask_for_sample(s->avctx, "Unsupported sample format.\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| else switch(s->bps) { | else switch(s->bps) { | ||||
| @@ -256,7 +256,8 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) | |||||
| // case 3: avctx->sample_fmt = AV_SAMPLE_FMT_S24; break; | // case 3: avctx->sample_fmt = AV_SAMPLE_FMT_S24; break; | ||||
| case 4: avctx->sample_fmt = AV_SAMPLE_FMT_S32; break; | case 4: avctx->sample_fmt = AV_SAMPLE_FMT_S32; break; | ||||
| default: | default: | ||||
| av_log(s->avctx, AV_LOG_ERROR, "Invalid/unsupported sample format. Please contact the developers.\n"); | |||||
| av_log_ask_for_sample(s->avctx, | |||||
| "Invalid/unsupported sample format.\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -1295,3 +1295,11 @@ void ff_thread_await_progress(AVFrame *f, int progress, int field) | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if FF_API_THREAD_INIT | |||||
| int avcodec_thread_init(AVCodecContext *s, int thread_count) | |||||
| { | |||||
| s->thread_count = thread_count; | |||||
| return ff_thread_init(s); | |||||
| } | |||||
| #endif | |||||
| @@ -52,7 +52,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac | |||||
| } | } | ||||
| if(avpkt->size > avctx->width * avctx->height * 8 / 3){ | if(avpkt->size > avctx->width * avctx->height * 8 / 3){ | ||||
| av_log(avctx, AV_LOG_ERROR, "Probably padded data, need sample!\n"); | |||||
| av_log_ask_for_sample(avctx, "Probably padded data\n"); | |||||
| } | } | ||||
| pic->reference= 0; | pic->reference= 0; | ||||
| @@ -21,7 +21,7 @@ | |||||
| #define AVCODEC_VERSION_H | #define AVCODEC_VERSION_H | ||||
| #define LIBAVCODEC_VERSION_MAJOR 53 | #define LIBAVCODEC_VERSION_MAJOR 53 | ||||
| #define LIBAVCODEC_VERSION_MINOR 0 | |||||
| #define LIBAVCODEC_VERSION_MINOR 1 | |||||
| #define LIBAVCODEC_VERSION_MICRO 0 | #define LIBAVCODEC_VERSION_MICRO 0 | ||||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
| @@ -62,5 +62,11 @@ | |||||
| #ifndef FF_API_REQUEST_CHANNELS | #ifndef FF_API_REQUEST_CHANNELS | ||||
| #define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 54) | #define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 54) | ||||
| #endif | #endif | ||||
| #ifndef FF_API_OPT_H | |||||
| #define FF_API_OPT_H (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
| #endif | |||||
| #ifndef FF_API_THREAD_INIT | |||||
| #define FF_API_THREAD_INIT (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
| #endif | |||||
| #endif /* AVCODEC_VERSION_H */ | #endif /* AVCODEC_VERSION_H */ | ||||
| @@ -26,6 +26,7 @@ | |||||
| #define _BSD_SOURCE 1 | #define _BSD_SOURCE 1 | ||||
| #define _NETBSD_SOURCE | #define _NETBSD_SOURCE | ||||
| #define _XOPEN_SOURCE 600 | |||||
| #include "libavformat/avformat.h" | #include "libavformat/avformat.h" | ||||
| #if HAVE_DEV_BKTR_IOCTL_METEOR_H && HAVE_DEV_BKTR_IOCTL_BT848_H | #if HAVE_DEV_BKTR_IOCTL_METEOR_H && HAVE_DEV_BKTR_IOCTL_BT848_H | ||||
| @@ -367,6 +367,7 @@ static int applehttp_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| for (i = 0; i < c->n_variants; i++) { | for (i = 0; i < c->n_variants; i++) { | ||||
| struct variant *v = c->variants[i]; | struct variant *v = c->variants[i]; | ||||
| AVInputFormat *in_fmt = NULL; | AVInputFormat *in_fmt = NULL; | ||||
| char bitrate_str[20]; | |||||
| if (v->n_segments == 0) | if (v->n_segments == 0) | ||||
| continue; | continue; | ||||
| @@ -393,6 +394,7 @@ static int applehttp_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| if (ret < 0) | if (ret < 0) | ||||
| goto fail; | goto fail; | ||||
| v->stream_offset = stream_offset; | v->stream_offset = stream_offset; | ||||
| snprintf(bitrate_str, sizeof(bitrate_str), "%d", v->bandwidth); | |||||
| /* Create new AVStreams for each stream in this variant */ | /* Create new AVStreams for each stream in this variant */ | ||||
| for (j = 0; j < v->ctx->nb_streams; j++) { | for (j = 0; j < v->ctx->nb_streams; j++) { | ||||
| AVStream *st = av_new_stream(s, i); | AVStream *st = av_new_stream(s, i); | ||||
| @@ -401,6 +403,7 @@ static int applehttp_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| goto fail; | goto fail; | ||||
| } | } | ||||
| avcodec_copy_context(st->codec, v->ctx->streams[j]->codec); | avcodec_copy_context(st->codec, v->ctx->streams[j]->codec); | ||||
| av_metadata_set2(&st->metadata, "variant_bitrate", bitrate_str, 0); | |||||
| } | } | ||||
| stream_offset += v->ctx->nb_streams; | stream_offset += v->ctx->nb_streams; | ||||
| } | } | ||||
| @@ -104,6 +104,7 @@ struct AVFormatContext; | |||||
| * service_provider -- name of the service provider in broadcasting. | * service_provider -- name of the service provider in broadcasting. | ||||
| * title -- name of the work. | * title -- name of the work. | ||||
| * track -- number of this work in the set, can be in form current/total. | * track -- number of this work in the set, can be in form current/total. | ||||
| * variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of | |||||
| */ | */ | ||||
| #define AV_METADATA_MATCH_CASE 1 | #define AV_METADATA_MATCH_CASE 1 | ||||
| @@ -586,7 +586,7 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, | |||||
| /* check filename in case an image number is expected */ | /* check filename in case an image number is expected */ | ||||
| if (fmt->flags & AVFMT_NEEDNUMBER) { | if (fmt->flags & AVFMT_NEEDNUMBER) { | ||||
| if (!av_filename_number_test(filename)) { | if (!av_filename_number_test(filename)) { | ||||
| err = AVERROR_NUMEXPECTED; | |||||
| err = AVERROR(EINVAL); | |||||
| goto fail; | goto fail; | ||||
| } | } | ||||
| } | } | ||||
| @@ -25,7 +25,7 @@ | |||||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | #define LIBAVFORMAT_VERSION_MAJOR 53 | ||||
| #define LIBAVFORMAT_VERSION_MINOR 0 | #define LIBAVFORMAT_VERSION_MINOR 0 | ||||
| #define LIBAVFORMAT_VERSION_MICRO 0 | |||||
| #define LIBAVFORMAT_VERSION_MICRO 1 | |||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
| LIBAVFORMAT_VERSION_MINOR, \ | LIBAVFORMAT_VERSION_MINOR, \ | ||||
| @@ -25,19 +25,19 @@ int av_strerror(int errnum, char *errbuf, size_t errbuf_size) | |||||
| const char *errstr = NULL; | const char *errstr = NULL; | ||||
| switch (errnum) { | switch (errnum) { | ||||
| case AVERROR_EOF: errstr = "End of file"; break; | |||||
| case AVERROR_INVALIDDATA: errstr = "Invalid data found when processing input"; break; | |||||
| case AVERROR_NUMEXPECTED: errstr = "Number syntax expected in filename"; break; | |||||
| case AVERROR_BSF_NOT_FOUND: errstr = "Bitstream filter not found" ; break; | |||||
| case AVERROR_DECODER_NOT_FOUND: errstr = "Decoder not found" ; break; | |||||
| case AVERROR_DEMUXER_NOT_FOUND: errstr = "Demuxer not found" ; break; | |||||
| case AVERROR_ENCODER_NOT_FOUND: errstr = "Encoder not found" ; break; | |||||
| case AVERROR_EOF: errstr = "End of file" ; break; | |||||
| case AVERROR_EXIT: errstr = "Immediate exit requested" ; break; | |||||
| case AVERROR_FILTER_NOT_FOUND: errstr = "Filter not found" ; break; | |||||
| case AVERROR_INVALIDDATA: errstr = "Invalid data found when processing input" ; break; | |||||
| case AVERROR_MUXER_NOT_FOUND: errstr = "Muxer not found" ; break; | |||||
| case AVERROR_OPTION_NOT_FOUND: errstr = "Option not found" ; break; | |||||
| case AVERROR_PATCHWELCOME: errstr = "Not yet implemented in FFmpeg, patches welcome"; break; | case AVERROR_PATCHWELCOME: errstr = "Not yet implemented in FFmpeg, patches welcome"; break; | ||||
| case AVERROR_DEMUXER_NOT_FOUND: errstr = "Demuxer not found"; break; | |||||
| case AVERROR_MUXER_NOT_FOUND: errstr = "Muxer not found"; break; | |||||
| case AVERROR_DECODER_NOT_FOUND: errstr = "Decoder not found"; break; | |||||
| case AVERROR_ENCODER_NOT_FOUND: errstr = "Encoder not found"; break; | |||||
| case AVERROR_PROTOCOL_NOT_FOUND:errstr = "Protocol not found"; break; | |||||
| case AVERROR_FILTER_NOT_FOUND: errstr = "Filter not found"; break; | |||||
| case AVERROR_BSF_NOT_FOUND: errstr = "Bitstream filter not found"; break; | |||||
| case AVERROR_STREAM_NOT_FOUND: errstr = "Stream not found"; break; | |||||
| case AVERROR_EXIT: errstr = "Immediate exit requested"; break; | |||||
| case AVERROR_PROTOCOL_NOT_FOUND:errstr = "Protocol not found" ; break; | |||||
| case AVERROR_STREAM_NOT_FOUND: errstr = "Stream not found" ; break; | |||||
| } | } | ||||
| if (errstr) { | if (errstr) { | ||||
| @@ -44,24 +44,22 @@ | |||||
| #define AVERROR_NOTSUPP AVERROR(ENOSYS) ///< Operation not supported | #define AVERROR_NOTSUPP AVERROR(ENOSYS) ///< Operation not supported | ||||
| #define AVERROR_UNKNOWN AVERROR(EINVAL) ///< Unknown error | #define AVERROR_UNKNOWN AVERROR(EINVAL) ///< Unknown error | ||||
| #define AVERROR_EOF AVERROR(EPIPE) ///< End of file | |||||
| #define AVERROR_PATCHWELCOME (-MKTAG('P','A','W','E')) ///< Not yet implemented in FFmpeg, patches welcome | |||||
| #define AVERROR_INVALIDDATA (-MKTAG('I','N','D','A')) ///< Invalid data found when processing input | |||||
| #define AVERROR_NUMEXPECTED (-MKTAG('N','U','E','X')) ///< Number syntax expected in filename | |||||
| #define AVERROR_DEMUXER_NOT_FOUND (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found | |||||
| #define AVERROR_MUXER_NOT_FOUND (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found | |||||
| #define AVERROR_BSF_NOT_FOUND (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found | |||||
| #define AVERROR_DECODER_NOT_FOUND (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found | #define AVERROR_DECODER_NOT_FOUND (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found | ||||
| #define AVERROR_DEMUXER_NOT_FOUND (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found | |||||
| #define AVERROR_ENCODER_NOT_FOUND (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found | #define AVERROR_ENCODER_NOT_FOUND (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found | ||||
| #define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found | |||||
| #define AVERROR_EOF (-MKTAG( 'E','O','F',' ')) ///< End of file | |||||
| #define AVERROR_EXIT (-MKTAG( 'E','X','I','T')) ///< Immediate exit was requested; the called function should not be restarted | |||||
| #define AVERROR_FILTER_NOT_FOUND (-MKTAG(0xF8,'F','I','L')) ///< Filter not found | #define AVERROR_FILTER_NOT_FOUND (-MKTAG(0xF8,'F','I','L')) ///< Filter not found | ||||
| #define AVERROR_BSF_NOT_FOUND (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found | |||||
| #define AVERROR_INVALIDDATA (-MKTAG( 'I','N','D','A')) ///< Invalid data found when processing input | |||||
| #define AVERROR_MUXER_NOT_FOUND (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found | |||||
| #define AVERROR_OPTION_NOT_FOUND (-MKTAG(0xF8,'O','P','T')) ///< Option not found | |||||
| #define AVERROR_PATCHWELCOME (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in FFmpeg, patches welcome | |||||
| #define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found | |||||
| #define AVERROR_STREAM_NOT_FOUND (-MKTAG(0xF8,'S','T','R')) ///< Stream not found | #define AVERROR_STREAM_NOT_FOUND (-MKTAG(0xF8,'S','T','R')) ///< Stream not found | ||||
| #define AVERROR_EXIT (-MKTAG('E','X','I','T')) ///< Immediate exit was requested; the called function should not be restarted | |||||
| /** | /** | ||||
| * Put a description of the AVERROR code errnum in errbuf. | * Put a description of the AVERROR code errnum in errbuf. | ||||
| * In case of failure the global variable errno is set to indicate the | * In case of failure the global variable errno is set to indicate the | ||||
| @@ -86,6 +86,13 @@ static av_always_inline av_const float roundf(float x) | |||||
| } | } | ||||
| #endif /* HAVE_ROUNDF */ | #endif /* HAVE_ROUNDF */ | ||||
| #if !HAVE_TRUNC | |||||
| static av_always_inline av_const double trunc(double x) | |||||
| { | |||||
| return (x > 0) ? floor(x) : ceil(x); | |||||
| } | |||||
| #endif /* HAVE_TRUNC */ | |||||
| #if !HAVE_TRUNCF | #if !HAVE_TRUNCF | ||||
| static av_always_inline av_const float truncf(float x) | static av_always_inline av_const float truncf(float x) | ||||
| { | { | ||||
| @@ -57,7 +57,7 @@ static int av_set_number2(void *obj, const char *name, double num, int den, int6 | |||||
| if (o_out) | if (o_out) | ||||
| *o_out= o; | *o_out= o; | ||||
| if (!o || o->offset<=0) | if (!o || o->offset<=0) | ||||
| return AVERROR(ENOENT); | |||||
| return AVERROR_OPTION_NOT_FOUND; | |||||
| if (o->max*den < num*intnum || o->min*den > num*intnum) { | if (o->max*den < num*intnum || o->min*den > num*intnum) { | ||||
| av_log(obj, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range\n", num, name); | av_log(obj, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range\n", num, name); | ||||
| @@ -119,7 +119,7 @@ int av_set_string3(void *obj, const char *name, const char *val, int alloc, cons | |||||
| if (o_out) | if (o_out) | ||||
| *o_out = o; | *o_out = o; | ||||
| if (!o) | if (!o) | ||||
| return AVERROR(ENOENT); | |||||
| return AVERROR_OPTION_NOT_FOUND; | |||||
| if (!val || o->offset<=0) | if (!val || o->offset<=0) | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| @@ -490,7 +490,7 @@ static int parse_key_value_pair(void *ctx, const char **buf, | |||||
| av_log(ctx, AV_LOG_DEBUG, "Setting value '%s' for key '%s'\n", val, key); | av_log(ctx, AV_LOG_DEBUG, "Setting value '%s' for key '%s'\n", val, key); | ||||
| ret = av_set_string3(ctx, key, val, 1, NULL); | ret = av_set_string3(ctx, key, val, 1, NULL); | ||||
| if (ret == AVERROR(ENOENT)) | |||||
| if (ret == AVERROR_OPTION_NOT_FOUND) | |||||
| av_log(ctx, AV_LOG_ERROR, "Key '%s' not found.\n", key); | av_log(ctx, AV_LOG_ERROR, "Key '%s' not found.\n", key); | ||||
| av_free(key); | av_free(key); | ||||
| @@ -16,6 +16,7 @@ cmp=${6:-diff} | |||||
| ref=${7:-"${base}/ref/fate/${test}"} | ref=${7:-"${base}/ref/fate/${test}"} | ||||
| fuzz=$8 | fuzz=$8 | ||||
| threads=${9:-1} | threads=${9:-1} | ||||
| thread_type=${10:-3} | |||||
| outdir="tests/data/fate" | outdir="tests/data/fate" | ||||
| outfile="${outdir}/${test}" | outfile="${outdir}/${test}" | ||||
| @@ -49,7 +50,7 @@ run(){ | |||||
| } | } | ||||
| ffmpeg(){ | ffmpeg(){ | ||||
| run ffmpeg -v 0 -threads $threads "$@" | |||||
| run ffmpeg -v 0 -threads $threads -thread_type $thread_type "$@" | |||||
| } | } | ||||
| framecrc(){ | framecrc(){ | ||||
| @@ -78,7 +79,7 @@ regtest(){ | |||||
| cleanfiles="$cleanfiles $outfile $errfile" | cleanfiles="$cleanfiles $outfile $errfile" | ||||
| outfile=tests/data/regression/$2/$t | outfile=tests/data/regression/$2/$t | ||||
| errfile=tests/data/$t.$2.err | errfile=tests/data/$t.$2.err | ||||
| ${base}/${1}-regression.sh $t $2 $3 "$target_exec" "$target_path" "$threads" | |||||
| ${base}/${1}-regression.sh $t $2 $3 "$target_exec" "$target_path" "$threads" "$thread_type" | |||||
| } | } | ||||
| codectest(){ | codectest(){ | ||||