* commit '142e76f1055de5dde44696e71a5f63f2cb11dedf': swscale: fix crash with dithering due incorrect offset calculation. matroskadec: fix stupid typo (!= -> ==) build: remove duplicates from order-only directory prerequisite list build: rework rules for things in the tools dir configure: fix --cpu=host with gcc 4.6 ARM: use const macro to define constant data in asm bitdepth: simplify FUNC/FUNCC macros dsputil: remove ff_emulated_edge_mc macro used in one place 9/10-bit: simplify clipping macros matroskadec: reindent matroskadec: defer parsing of cues element until we seek. lavc: add support for codec-specific defaults. lavc: make avcodec_alloc_context3 officially public. lavc: remove a half-working attempt at different defaults for audio/video codecs. ac3dec: add a drc_scale private option lavf: add avformat_find_stream_info() lavc: introduce avcodec_open2() as a replacement for avcodec_open(). Conflicts: Makefile libavcodec/utils.c libavformat/avformat.h libswscale/swscale_internal.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -18,6 +18,8 @@ PROGS_G = $(PROGS-yes:%=%_g$(EXESUF)) | |||||
| OBJS = $(PROGS-yes:%=%.o) cmdutils.o | OBJS = $(PROGS-yes:%=%.o) cmdutils.o | ||||
| TESTTOOLS = audiogen videogen rotozoom tiny_psnr base64 | TESTTOOLS = audiogen videogen rotozoom tiny_psnr base64 | ||||
| HOSTPROGS := $(TESTTOOLS:%=tests/%) | HOSTPROGS := $(TESTTOOLS:%=tests/%) | ||||
| TOOLS = qt-faststart trasher | |||||
| TOOLS-$(CONFIG_ZLIB) += cws2fws | |||||
| BASENAMES = ffmpeg ffplay ffprobe ffserver | BASENAMES = ffmpeg ffplay ffprobe ffserver | ||||
| ALLPROGS = $(BASENAMES:%=%$(EXESUF)) | ALLPROGS = $(BASENAMES:%=%$(EXESUF)) | ||||
| @@ -51,6 +53,11 @@ $(PROGS): %$(EXESUF): %_g$(EXESUF) | |||||
| $(CP) $< $@ | $(CP) $< $@ | ||||
| $(STRIP) $@ | $(STRIP) $@ | ||||
| $(TOOLS): %$(EXESUF): %.o | |||||
| $(LD) $(LDFLAGS) -o $@ $< $(ELIBS) | |||||
| tools/cws2fws$(EXESUF): ELIBS = -lz | |||||
| config.h: .config | config.h: .config | ||||
| .config: $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) | .config: $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) | ||||
| @-tput bold 2>/dev/null | @-tput bold 2>/dev/null | ||||
| @@ -59,7 +66,7 @@ config.h: .config | |||||
| SUBDIR_VARS := OBJS FFLIBS CLEANFILES DIRS TESTPROGS EXAMPLES SKIPHEADERS \ | SUBDIR_VARS := OBJS FFLIBS CLEANFILES DIRS TESTPROGS EXAMPLES SKIPHEADERS \ | ||||
| ALTIVEC-OBJS MMX-OBJS NEON-OBJS X86-OBJS YASM-OBJS-FFT YASM-OBJS \ | ALTIVEC-OBJS MMX-OBJS NEON-OBJS X86-OBJS YASM-OBJS-FFT YASM-OBJS \ | ||||
| HOSTPROGS BUILT_HEADERS TESTOBJS ARCH_HEADERS ARMV6-OBJS | |||||
| HOSTPROGS BUILT_HEADERS TESTOBJS ARCH_HEADERS ARMV6-OBJS TOOLS | |||||
| define RESET | define RESET | ||||
| $(1) := | $(1) := | ||||
| @@ -81,18 +88,6 @@ ffserver_g$(EXESUF): FF_LDFLAGS += $(FFSERVERLDFLAGS) | |||||
| %_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS) | %_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS) | ||||
| $(LD) $(FF_LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS) | $(LD) $(FF_LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS) | ||||
| TOOLS = cws2fws graph2dot lavfi-showfiltfmts pktdumper probetest qt-faststart trasher | |||||
| TOOLOBJS := $(TOOLS:%=tools/%.o) | |||||
| TOOLS := $(TOOLS:%=tools/%$(EXESUF)) | |||||
| alltools: $(TOOLS) | |||||
| tools/%$(EXESUF): tools/%.o | |||||
| $(LD) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS) | |||||
| $(TOOLOBJS): %.o: %.c | tools | |||||
| $(CC) $(CPPFLAGS) $(CFLAGS) -c $(CC_O) $< | |||||
| OBJDIRS += tools | OBJDIRS += tools | ||||
| -include $(wildcard tools/*.d) | -include $(wildcard tools/*.d) | ||||
| @@ -63,7 +63,7 @@ void init_opts(void) | |||||
| { | { | ||||
| int i; | int i; | ||||
| for (i = 0; i < AVMEDIA_TYPE_NB; i++) | for (i = 0; i < AVMEDIA_TYPE_NB; i++) | ||||
| avcodec_opts[i] = avcodec_alloc_context2(i); | |||||
| avcodec_opts[i] = avcodec_alloc_context3(NULL); | |||||
| avformat_opts = avformat_alloc_context(); | avformat_opts = avformat_alloc_context(); | ||||
| #if CONFIG_SWSCALE | #if CONFIG_SWSCALE | ||||
| sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL); | sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL); | ||||
| @@ -77,6 +77,9 @@ TESTOBJS := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o) | |||||
| TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF)) | TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF)) | ||||
| HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o) | HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o) | ||||
| HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF)) | HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF)) | ||||
| TOOLS += $(TOOLS-yes) | |||||
| TOOLOBJS := $(TOOLS:%=tools/%.o) | |||||
| TOOLS := $(TOOLS:%=tools/%$(EXESUF)) | |||||
| DEP_LIBS := $(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME)) | DEP_LIBS := $(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME)) | ||||
| @@ -85,15 +88,18 @@ SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-) | |||||
| SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) | SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) | ||||
| checkheaders: $(filter-out $(SKIPHEADERS:.h=.ho),$(ALLHEADERS:.h=.ho)) | checkheaders: $(filter-out $(SKIPHEADERS:.h=.ho),$(ALLHEADERS:.h=.ho)) | ||||
| alltools: $(TOOLS) | |||||
| $(HOSTOBJS): %.o: %.c | $(HOSTOBJS): %.o: %.c | ||||
| $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $< | $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $< | ||||
| $(HOSTPROGS): %$(HOSTEXESUF): %.o | $(HOSTPROGS): %$(HOSTEXESUF): %.o | ||||
| $(HOSTCC) $(HOSTLDFLAGS) -o $@ $< $(HOSTLIBS) | $(HOSTCC) $(HOSTLDFLAGS) -o $@ $< $(HOSTLIBS) | ||||
| $(OBJS): | $(dir $(OBJS)) | |||||
| $(HOSTOBJS): | $(dir $(HOSTOBJS)) | |||||
| $(TESTOBJS): | $(dir $(TESTOBJS)) | |||||
| $(OBJS): | $(sort $(dir $(OBJS))) | |||||
| $(HOSTOBJS): | $(sort $(dir $(HOSTOBJS))) | |||||
| $(TESTOBJS): | $(sort $(dir $(TESTOBJS))) | |||||
| $(TOOLOBJS): | tools | |||||
| OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS)) | OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS)) | ||||
| @@ -2137,7 +2137,7 @@ if test "$cpu" = host; then | |||||
| gcc|llvm_gcc) | gcc|llvm_gcc) | ||||
| check_native(){ | check_native(){ | ||||
| $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return | $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return | ||||
| sed -n "/$1=/{ | |||||
| sed -n "/cc1.*$1=/{ | |||||
| s/.*$1=\\([^ ]*\\).*/\\1/ | s/.*$1=\\([^ ]*\\).*/\\1/ | ||||
| p | p | ||||
| q | q | ||||
| @@ -56,7 +56,7 @@ static void audio_encode_example(const char *filename) | |||||
| exit(1); | exit(1); | ||||
| } | } | ||||
| c= avcodec_alloc_context(); | |||||
| c = avcodec_alloc_context3(codec); | |||||
| /* put sample parameters */ | /* put sample parameters */ | ||||
| c->bit_rate = 64000; | c->bit_rate = 64000; | ||||
| @@ -127,7 +127,7 @@ static void audio_decode_example(const char *outfilename, const char *filename) | |||||
| exit(1); | exit(1); | ||||
| } | } | ||||
| c= avcodec_alloc_context(); | |||||
| c = avcodec_alloc_context3(codec); | |||||
| /* open it */ | /* open it */ | ||||
| if (avcodec_open(c, codec) < 0) { | if (avcodec_open(c, codec) < 0) { | ||||
| @@ -208,7 +208,7 @@ static void video_encode_example(const char *filename) | |||||
| exit(1); | exit(1); | ||||
| } | } | ||||
| c= avcodec_alloc_context(); | |||||
| c = avcodec_alloc_context3(codec); | |||||
| picture= avcodec_alloc_frame(); | picture= avcodec_alloc_frame(); | ||||
| /* put sample parameters */ | /* put sample parameters */ | ||||
| @@ -335,7 +335,7 @@ static void video_decode_example(const char *outfilename, const char *filename) | |||||
| exit(1); | exit(1); | ||||
| } | } | ||||
| c= avcodec_alloc_context(); | |||||
| c = avcodec_alloc_context3(codec); | |||||
| picture= avcodec_alloc_frame(); | picture= avcodec_alloc_frame(); | ||||
| if(codec->capabilities&CODEC_CAP_TRUNCATED) | if(codec->capabilities&CODEC_CAP_TRUNCATED) | ||||
| @@ -294,7 +294,7 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename) | |||||
| if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { | if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { | ||||
| fprintf(stderr, "Unsupported codec with id %d for input stream %d\n", | fprintf(stderr, "Unsupported codec with id %d for input stream %d\n", | ||||
| stream->codec->codec_id, stream->index); | stream->codec->codec_id, stream->index); | ||||
| } else if (avcodec_open(stream->codec, codec) < 0) { | |||||
| } else if (avcodec_open2(stream->codec, codec, NULL) < 0) { | |||||
| fprintf(stderr, "Error while opening codec for input stream %d\n", | fprintf(stderr, "Error while opening codec for input stream %d\n", | ||||
| stream->index); | stream->index); | ||||
| } | } | ||||
| @@ -2117,7 +2117,7 @@ static void open_parser(AVFormatContext *s, int i) | |||||
| codec = avcodec_find_decoder(st->codec->codec_id); | codec = avcodec_find_decoder(st->codec->codec_id); | ||||
| if (codec && (codec->capabilities & CODEC_CAP_PARSE_ONLY)) { | if (codec && (codec->capabilities & CODEC_CAP_PARSE_ONLY)) { | ||||
| st->codec->parse_only = 1; | st->codec->parse_only = 1; | ||||
| if (avcodec_open(st->codec, codec) < 0) | |||||
| if (avcodec_open2(st->codec, codec, NULL) < 0) | |||||
| st->codec->parse_only = 0; | st->codec->parse_only = 0; | ||||
| } | } | ||||
| } | } | ||||
| @@ -3468,7 +3468,7 @@ static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec, int cop | |||||
| if (!fst) | if (!fst) | ||||
| return NULL; | return NULL; | ||||
| if (copy) { | if (copy) { | ||||
| fst->codec= avcodec_alloc_context(); | |||||
| fst->codec = avcodec_alloc_context3(NULL); | |||||
| memcpy(fst->codec, codec, sizeof(AVCodecContext)); | memcpy(fst->codec, codec, sizeof(AVCodecContext)); | ||||
| if (codec->extradata_size) { | if (codec->extradata_size) { | ||||
| fst->codec->extradata = av_malloc(codec->extradata_size); | fst->codec->extradata = av_malloc(codec->extradata_size); | ||||
| @@ -3885,7 +3885,7 @@ static void add_codec(FFStream *stream, AVCodecContext *av) | |||||
| st = av_mallocz(sizeof(AVStream)); | st = av_mallocz(sizeof(AVStream)); | ||||
| if (!st) | if (!st) | ||||
| return; | return; | ||||
| st->codec = avcodec_alloc_context(); | |||||
| st->codec = avcodec_alloc_context3(NULL); | |||||
| stream->streams[stream->nb_streams++] = st; | stream->streams[stream->nb_streams++] = st; | ||||
| memcpy(st->codec, av, sizeof(AVCodecContext)); | memcpy(st->codec, av, sizeof(AVCodecContext)); | ||||
| } | } | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include <string.h> | #include <string.h> | ||||
| #include "libavutil/crc.h" | #include "libavutil/crc.h" | ||||
| #include "libavutil/opt.h" | |||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "aac_ac3_parser.h" | #include "aac_ac3_parser.h" | ||||
| #include "ac3_parser.h" | #include "ac3_parser.h" | ||||
| @@ -1438,6 +1439,20 @@ static av_cold int ac3_decode_end(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #define OFFSET(x) offsetof(AC3DecodeContext, x) | |||||
| #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM) | |||||
| static const AVOption options[] = { | |||||
| { "drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), FF_OPT_TYPE_FLOAT, {1.0}, 0.0, 1.0, PAR }, | |||||
| { NULL}, | |||||
| }; | |||||
| static const AVClass ac3_decoder_class = { | |||||
| .class_name = "(E-)AC3 decoder", | |||||
| .item_name = av_default_item_name, | |||||
| .option = options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| AVCodec ff_ac3_decoder = { | AVCodec ff_ac3_decoder = { | ||||
| .name = "ac3", | .name = "ac3", | ||||
| .type = AVMEDIA_TYPE_AUDIO, | .type = AVMEDIA_TYPE_AUDIO, | ||||
| @@ -1450,6 +1465,7 @@ AVCodec ff_ac3_decoder = { | |||||
| .sample_fmts = (const enum AVSampleFormat[]) { | .sample_fmts = (const enum AVSampleFormat[]) { | ||||
| AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE | AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE | ||||
| }, | }, | ||||
| .priv_class = &ac3_decoder_class, | |||||
| }; | }; | ||||
| #if CONFIG_EAC3_DECODER | #if CONFIG_EAC3_DECODER | ||||
| @@ -1465,5 +1481,6 @@ AVCodec ff_eac3_decoder = { | |||||
| .sample_fmts = (const enum AVSampleFormat[]) { | .sample_fmts = (const enum AVSampleFormat[]) { | ||||
| AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE | AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE | ||||
| }, | }, | ||||
| .priv_class = &ac3_decoder_class, | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -66,6 +66,7 @@ | |||||
| #define AC3_FRAME_BUFFER_SIZE 32768 | #define AC3_FRAME_BUFFER_SIZE 32768 | ||||
| typedef struct { | typedef struct { | ||||
| AVClass *class; ///< class for AVOptions | |||||
| AVCodecContext *avctx; ///< parent context | AVCodecContext *avctx; ///< parent context | ||||
| GetBitContext gbc; ///< bitstream reader | GetBitContext gbc; ///< bitstream reader | ||||
| @@ -143,6 +144,7 @@ typedef struct { | |||||
| ///@name Dynamic range | ///@name Dynamic range | ||||
| float dynamic_range[2]; ///< dynamic range | float dynamic_range[2]; ///< dynamic range | ||||
| float drc_scale; ///< percentage of dynamic range compression to be applied | |||||
| ///@} | ///@} | ||||
| ///@name Bandwidth | ///@name Bandwidth | ||||
| @@ -349,9 +349,7 @@ function ff_fft_permute_neon, export=1 | |||||
| pop {r4,pc} | pop {r4,pc} | ||||
| endfunc | endfunc | ||||
| .section .rodata | |||||
| .align 4 | |||||
| fft_tab_neon: | |||||
| const fft_tab_neon | |||||
| .word fft4_neon | .word fft4_neon | ||||
| .word fft8_neon | .word fft8_neon | ||||
| .word fft16_neon | .word fft16_neon | ||||
| @@ -367,8 +365,12 @@ fft_tab_neon: | |||||
| .word fft16384_neon | .word fft16384_neon | ||||
| .word fft32768_neon | .word fft32768_neon | ||||
| .word fft65536_neon | .word fft65536_neon | ||||
| ELF .size fft_tab_neon, . - fft_tab_neon | |||||
| endconst | |||||
| .align 4 | |||||
| pmmp: .float +1.0, -1.0, -1.0, +1.0 | |||||
| mppm: .float -M_SQRT1_2, M_SQRT1_2, M_SQRT1_2, -M_SQRT1_2 | |||||
| const pmmp, align=4 | |||||
| .float +1.0, -1.0, -1.0, +1.0 | |||||
| endconst | |||||
| const mppm, align=4 | |||||
| .float -M_SQRT1_2, M_SQRT1_2, M_SQRT1_2, -M_SQRT1_2 | |||||
| endconst | |||||
| @@ -383,8 +383,8 @@ function ff_h264_idct8_add4_neon, export=1 | |||||
| pop {r4-r8,pc} | pop {r4-r8,pc} | ||||
| endfunc | endfunc | ||||
| .section .rodata | |||||
| scan8: .byte 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8 | |||||
| const scan8 | |||||
| .byte 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8 | |||||
| .byte 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8 | .byte 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8 | ||||
| .byte 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8 | .byte 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8 | ||||
| .byte 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8 | .byte 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8 | ||||
| @@ -396,3 +396,4 @@ scan8: .byte 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8 | |||||
| .byte 6+11*8, 7+11*8, 6+12*8, 7+12*8 | .byte 6+11*8, 7+11*8, 6+12*8, 7+12*8 | ||||
| .byte 4+13*8, 5+13*8, 4+14*8, 5+14*8 | .byte 4+13*8, 5+13*8, 4+14*8, 5+14*8 | ||||
| .byte 6+13*8, 7+13*8, 6+14*8, 7+14*8 | .byte 6+13*8, 7+13*8, 6+14*8, 7+14*8 | ||||
| endconst | |||||
| @@ -166,12 +166,9 @@ function ff_pred16x16_plane_neon, export=1 | |||||
| bx lr | bx lr | ||||
| endfunc | endfunc | ||||
| .section .rodata | |||||
| .align 4 | |||||
| p16weight: | |||||
| const p16weight, align=4 | |||||
| .short 1,2,3,4,5,6,7,8 | .short 1,2,3,4,5,6,7,8 | ||||
| .text | |||||
| endconst | |||||
| function ff_pred8x8_hor_neon, export=1 | function ff_pred8x8_hor_neon, export=1 | ||||
| sub r2, r0, #1 | sub r2, r0, #1 | ||||
| @@ -243,10 +243,9 @@ function idct_col4_st8_neon | |||||
| bx lr | bx lr | ||||
| endfunc | endfunc | ||||
| .section .rodata | |||||
| .align 4 | |||||
| idct_coeff_neon: | |||||
| const idct_coeff_neon, align=4 | |||||
| .short W1, W2, W3, W4, W5, W6, W7, W4c | .short W1, W2, W3, W4, W5, W6, W7, W4c | ||||
| endconst | |||||
| .macro idct_start data | .macro idct_start data | ||||
| push {r4-r7, lr} | push {r4-r7, lr} | ||||
| @@ -20,11 +20,9 @@ | |||||
| #include "asm.S" | #include "asm.S" | ||||
| .section .rodata | |||||
| .align 4 | |||||
| vp3_idct_constants: | |||||
| const vp3_idct_constants, align=4 | |||||
| .short 64277, 60547, 54491, 46341, 36410, 25080, 12785 | .short 64277, 60547, 54491, 46341, 36410, 25080, 12785 | ||||
| endconst | |||||
| #define xC1S7 d0[0] | #define xC1S7 d0[0] | ||||
| #define xC2S6 d0[1] | #define xC2S6 d0[1] | ||||
| @@ -34,8 +32,6 @@ vp3_idct_constants: | |||||
| #define xC6S2 d1[1] | #define xC6S2 d1[1] | ||||
| #define xC7S1 d1[2] | #define xC7S1 d1[2] | ||||
| .text | |||||
| .macro vp3_loop_filter | .macro vp3_loop_filter | ||||
| vsubl.u8 q3, d18, d17 | vsubl.u8 q3, d18, d17 | ||||
| vsubl.u8 q2, d16, d19 | vsubl.u8 q2, d16, d19 | ||||
| @@ -240,9 +240,9 @@ A orrcs r8, r8, r10, lsl r6 | |||||
| b 5b | b 5b | ||||
| endfunc | endfunc | ||||
| .section .rodata | |||||
| zigzag_scan: | |||||
| const zigzag_scan | |||||
| .byte 0, 2, 8, 16 | .byte 0, 2, 8, 16 | ||||
| .byte 10, 4, 6, 12 | .byte 10, 4, 6, 12 | ||||
| .byte 18, 24, 26, 20 | .byte 18, 24, 26, 20 | ||||
| .byte 14, 22, 28, 30 | .byte 14, 22, 28, 30 | ||||
| endconst | |||||
| @@ -30,6 +30,7 @@ | |||||
| #include "libavutil/samplefmt.h" | #include "libavutil/samplefmt.h" | ||||
| #include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/dict.h" | |||||
| #include "libavutil/log.h" | #include "libavutil/log.h" | ||||
| #include "libavutil/pixfmt.h" | #include "libavutil/pixfmt.h" | ||||
| #include "libavutil/rational.h" | #include "libavutil/rational.h" | ||||
| @@ -2590,13 +2591,16 @@ typedef struct AVCodecContext { | |||||
| int request_channels; | int request_channels; | ||||
| #endif | #endif | ||||
| #if FF_API_DRC_SCALE | |||||
| /** | /** | ||||
| * Percentage of dynamic range compression to be applied by the decoder. | * Percentage of dynamic range compression to be applied by the decoder. | ||||
| * The default value is 1.0, corresponding to full compression. | * The default value is 1.0, corresponding to full compression. | ||||
| * - encoding: unused | * - encoding: unused | ||||
| * - decoding: Set by user. | * - decoding: Set by user. | ||||
| * @deprecated use AC3 decoder private option instead. | |||||
| */ | */ | ||||
| float drc_scale; | |||||
| attribute_deprecated float drc_scale; | |||||
| #endif | |||||
| /** | /** | ||||
| * opaque 64bit number (generally a PTS) that will be reordered and | * opaque 64bit number (generally a PTS) that will be reordered and | ||||
| @@ -2916,6 +2920,8 @@ typedef struct AVProfile { | |||||
| const char *name; ///< short name for the profile | const char *name; ///< short name for the profile | ||||
| } AVProfile; | } AVProfile; | ||||
| typedef struct AVCodecDefault AVCodecDefault; | |||||
| /** | /** | ||||
| * AVCodec. | * AVCodec. | ||||
| */ | */ | ||||
| @@ -2978,6 +2984,11 @@ typedef struct AVCodec { | |||||
| */ | */ | ||||
| int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); | int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); | ||||
| /** @} */ | /** @} */ | ||||
| /** | |||||
| * Private codec-specific defaults. | |||||
| */ | |||||
| const AVCodecDefault *defaults; | |||||
| } AVCodec; | } AVCodec; | ||||
| /** | /** | ||||
| @@ -3593,21 +3604,38 @@ void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType); | |||||
| * we WILL change its arguments and name a few times! */ | * we WILL change its arguments and name a few times! */ | ||||
| int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec); | int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec); | ||||
| #if FF_API_ALLOC_CONTEXT | |||||
| /** | /** | ||||
| * Allocate an AVCodecContext and set its fields to default values. The | * Allocate an AVCodecContext and set its fields to default values. The | ||||
| * resulting struct can be deallocated by simply calling av_free(). | * resulting struct can be deallocated by simply calling av_free(). | ||||
| * | * | ||||
| * @return An AVCodecContext filled with default values or NULL on failure. | * @return An AVCodecContext filled with default values or NULL on failure. | ||||
| * @see avcodec_get_context_defaults | * @see avcodec_get_context_defaults | ||||
| * | |||||
| * @deprecated use avcodec_alloc_context3() | |||||
| */ | */ | ||||
| attribute_deprecated | |||||
| AVCodecContext *avcodec_alloc_context(void); | AVCodecContext *avcodec_alloc_context(void); | ||||
| /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! | /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! | ||||
| * we WILL change its arguments and name a few times! */ | * we WILL change its arguments and name a few times! */ | ||||
| attribute_deprecated | |||||
| AVCodecContext *avcodec_alloc_context2(enum AVMediaType); | AVCodecContext *avcodec_alloc_context2(enum AVMediaType); | ||||
| #endif | |||||
| /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! | |||||
| * we WILL change its arguments and name a few times! */ | |||||
| /** | |||||
| * Allocate an AVCodecContext and set its fields to default values. The | |||||
| * resulting struct can be deallocated by simply calling av_free(). | |||||
| * | |||||
| * @param codec if non-NULL, allocate private data and initialize defaults | |||||
| * for the given codec. It is illegal to then call avcodec_open() | |||||
| * with a different codec. | |||||
| * | |||||
| * @return An AVCodecContext filled with default values or NULL on failure. | |||||
| * @see avcodec_get_context_defaults | |||||
| * | |||||
| * @deprecated use avcodec_alloc_context3() | |||||
| */ | |||||
| AVCodecContext *avcodec_alloc_context3(AVCodec *codec); | AVCodecContext *avcodec_alloc_context3(AVCodec *codec); | ||||
| /** | /** | ||||
| @@ -3617,7 +3645,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec); | |||||
| * can use this AVCodecContext to decode/encode video/audio data. | * can use this AVCodecContext to decode/encode video/audio data. | ||||
| * | * | ||||
| * @param dest target codec context, should be initialized with | * @param dest target codec context, should be initialized with | ||||
| * avcodec_alloc_context(), but otherwise uninitialized | |||||
| * avcodec_alloc_context3(), but otherwise uninitialized | |||||
| * @param src source codec context | * @param src source codec context | ||||
| * @return AVERROR() on error (e.g. memory allocation error), 0 on success | * @return AVERROR() on error (e.g. memory allocation error), 0 on success | ||||
| */ | */ | ||||
| @@ -3687,6 +3715,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v | |||||
| 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 | ||||
| #if FF_API_AVCODEC_OPEN | |||||
| /** | /** | ||||
| * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | ||||
| * function the context has to be allocated. | * function the context has to be allocated. | ||||
| @@ -3703,7 +3732,7 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, | |||||
| * if (!codec) | * if (!codec) | ||||
| * exit(1); | * exit(1); | ||||
| * | * | ||||
| * context = avcodec_alloc_context(); | |||||
| * context = avcodec_alloc_context3(codec); | |||||
| * | * | ||||
| * if (avcodec_open(context, codec) < 0) | * if (avcodec_open(context, codec) < 0) | ||||
| * exit(1); | * exit(1); | ||||
| @@ -3712,9 +3741,46 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, | |||||
| * @param avctx The context which will be set up to use the given codec. | * @param avctx The context which will be set up to use the given codec. | ||||
| * @param codec The codec to use within the context. | * @param codec The codec to use within the context. | ||||
| * @return zero on success, a negative value on error | * @return zero on success, a negative value on error | ||||
| * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close | |||||
| * @see avcodec_alloc_context3, avcodec_find_decoder, avcodec_find_encoder, avcodec_close | |||||
| * | |||||
| * @deprecated use avcodec_open2 | |||||
| */ | */ | ||||
| attribute_deprecated | |||||
| int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | ||||
| #endif | |||||
| /** | |||||
| * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | |||||
| * function the context has to be allocated with avcodec_alloc_context(). | |||||
| * | |||||
| * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), | |||||
| * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for | |||||
| * retrieving a codec. | |||||
| * | |||||
| * @warning This function is not thread safe! | |||||
| * | |||||
| * @code | |||||
| * avcodec_register_all(); | |||||
| * av_dict_set(&opts, "b", "2.5M", 0); | |||||
| * codec = avcodec_find_decoder(CODEC_ID_H264); | |||||
| * if (!codec) | |||||
| * exit(1); | |||||
| * | |||||
| * context = avcodec_alloc_context(); | |||||
| * | |||||
| * if (avcodec_open(context, codec, opts) < 0) | |||||
| * exit(1); | |||||
| * @endcode | |||||
| * | |||||
| * @param avctx The context to initialize. | |||||
| * @param options A dictionary filled with AVCodecContext and codec-private options. | |||||
| * On return this object will be filled with options that were not found. | |||||
| * | |||||
| * @return zero on success, a negative value on error | |||||
| * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), | |||||
| * av_dict_set(), av_opt_find(). | |||||
| */ | |||||
| int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options); | |||||
| /** | /** | ||||
| * Decode the audio frame of size avpkt->size from avpkt->data into samples. | * Decode the audio frame of size avpkt->size from avpkt->data into samples. | ||||
| @@ -43,15 +43,6 @@ | |||||
| # undef PIXEL_SPLAT_X4 | # undef PIXEL_SPLAT_X4 | ||||
| #else | #else | ||||
| # define AVCODEC_H264_HIGH_DEPTH_H | # define AVCODEC_H264_HIGH_DEPTH_H | ||||
| # define CLIP_PIXEL(depth)\ | |||||
| static inline uint16_t av_clip_pixel_ ## depth (int p)\ | |||||
| {\ | |||||
| const int pixel_max = (1 << depth)-1;\ | |||||
| return (p & ~pixel_max) ? (-p)>>31 & pixel_max : p;\ | |||||
| } | |||||
| CLIP_PIXEL( 9) | |||||
| CLIP_PIXEL(10) | |||||
| #endif | #endif | ||||
| #if BIT_DEPTH > 8 | #if BIT_DEPTH > 8 | ||||
| @@ -70,6 +61,9 @@ CLIP_PIXEL(10) | |||||
| # define AV_WN4P AV_WN64 | # define AV_WN4P AV_WN64 | ||||
| # define AV_WN4PA AV_WN64A | # define AV_WN4PA AV_WN64A | ||||
| # define PIXEL_SPLAT_X4(x) ((x)*0x0001000100010001ULL) | # define PIXEL_SPLAT_X4(x) ((x)*0x0001000100010001ULL) | ||||
| # define av_clip_pixel(a) av_clip_uintp2(a, BIT_DEPTH) | |||||
| # define CLIP(a) av_clip_uintp2(a, BIT_DEPTH) | |||||
| #else | #else | ||||
| # define pixel uint8_t | # define pixel uint8_t | ||||
| # define pixel2 uint16_t | # define pixel2 uint16_t | ||||
| @@ -86,21 +80,12 @@ CLIP_PIXEL(10) | |||||
| # define AV_WN4P AV_WN32 | # define AV_WN4P AV_WN32 | ||||
| # define AV_WN4PA AV_WN32A | # define AV_WN4PA AV_WN32A | ||||
| # define PIXEL_SPLAT_X4(x) ((x)*0x01010101U) | # define PIXEL_SPLAT_X4(x) ((x)*0x01010101U) | ||||
| #endif | |||||
| #if BIT_DEPTH == 8 | |||||
| # define av_clip_pixel(a) av_clip_uint8(a) | # define av_clip_pixel(a) av_clip_uint8(a) | ||||
| # define CLIP(a) cm[a] | # define CLIP(a) cm[a] | ||||
| # define FUNC(a) a ## _8 | |||||
| # define FUNCC(a) a ## _8_c | |||||
| #elif BIT_DEPTH == 9 | |||||
| # define av_clip_pixel(a) av_clip_pixel_9(a) | |||||
| # define CLIP(a) av_clip_pixel_9(a) | |||||
| # define FUNC(a) a ## _9 | |||||
| # define FUNCC(a) a ## _9_c | |||||
| #elif BIT_DEPTH == 10 | |||||
| # define av_clip_pixel(a) av_clip_pixel_10(a) | |||||
| # define CLIP(a) av_clip_pixel_10(a) | |||||
| # define FUNC(a) a ## _10 | |||||
| # define FUNCC(a) a ## _10_c | |||||
| #endif | #endif | ||||
| #define FUNC3(a, b, c) a ## _ ## b ## c | |||||
| #define FUNC2(a, b, c) FUNC3(a, b, c) | |||||
| #define FUNC(a) FUNC2(a, BIT_DEPTH,) | |||||
| #define FUNCC(a) FUNC2(a, BIT_DEPTH, _c) | |||||
| @@ -211,8 +211,6 @@ EMULATED_EDGE(8) | |||||
| EMULATED_EDGE(9) | EMULATED_EDGE(9) | ||||
| EMULATED_EDGE(10) | EMULATED_EDGE(10) | ||||
| #define ff_emulated_edge_mc ff_emulated_edge_mc_8 | |||||
| void ff_add_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | void ff_add_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | ||||
| void ff_put_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | void ff_put_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | ||||
| void ff_put_signed_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | void ff_put_signed_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize); | ||||
| @@ -27,6 +27,11 @@ | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| struct AVCodecDefault { | |||||
| const uint8_t *key; | |||||
| const uint8_t *value; | |||||
| }; | |||||
| /** | /** | ||||
| * Determine whether pix_fmt is a hardware accelerated format. | * Determine whether pix_fmt is a hardware accelerated format. | ||||
| */ | */ | ||||
| @@ -144,7 +144,7 @@ int main(int argc, char **argv) | |||||
| printf("ffmpeg motion test\n"); | printf("ffmpeg motion test\n"); | ||||
| ctx = avcodec_alloc_context(); | |||||
| ctx = avcodec_alloc_context3(NULL); | |||||
| ctx->dsp_mask = AV_CPU_FLAG_FORCE; | ctx->dsp_mask = AV_CPU_FLAG_FORCE; | ||||
| dsputil_init(&cctx, ctx); | dsputil_init(&cctx, ctx); | ||||
| for (c = 0; c < flags_size; c++) { | for (c = 0; c < flags_size; c++) { | ||||
| @@ -944,7 +944,7 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){ | |||||
| static int estimate_best_b_count(MpegEncContext *s){ | static int estimate_best_b_count(MpegEncContext *s){ | ||||
| AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id); | AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id); | ||||
| AVCodecContext *c= avcodec_alloc_context(); | |||||
| AVCodecContext *c = avcodec_alloc_context3(NULL); | |||||
| AVFrame input[FF_MAX_B_FRAMES+2]; | AVFrame input[FF_MAX_B_FRAMES+2]; | ||||
| const int scale= s->avctx->brd_scale; | const int scale= s->avctx->brd_scale; | ||||
| int i, j, out_size, p_lambda, b_lambda, lambda2; | int i, j, out_size, p_lambda, b_lambda, lambda2; | ||||
| @@ -973,7 +973,7 @@ static int estimate_best_b_count(MpegEncContext *s){ | |||||
| c->time_base= s->avctx->time_base; | c->time_base= s->avctx->time_base; | ||||
| c->max_b_frames= s->max_b_frames; | c->max_b_frames= s->max_b_frames; | ||||
| if (avcodec_open(c, codec) < 0) | |||||
| if (avcodec_open2(c, codec, NULL) < 0) | |||||
| return -1; | return -1; | ||||
| for(i=0; i<s->max_b_frames+2; i++){ | for(i=0; i<s->max_b_frames+2; i++){ | ||||
| @@ -25,6 +25,8 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | |||||
| #include "libavutil/avassert.h" | |||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include <float.h> /* FLT_MIN, FLT_MAX */ | #include <float.h> /* FLT_MIN, FLT_MAX */ | ||||
| @@ -69,7 +71,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit, i | |||||
| static const AVOption options[]={ | static const AVOption options[]={ | ||||
| {"b", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, V|E}, | {"b", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, V|E}, | ||||
| {"ab", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = 64*1000 }, INT_MIN, INT_MAX, A|E}, | |||||
| {"ab", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, A|E}, | |||||
| {"bt", "set video bitrate tolerance (in bits/s)", OFFSET(bit_rate_tolerance), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE*20 }, 1, INT_MAX, V|E}, | {"bt", "set video bitrate tolerance (in bits/s)", OFFSET(bit_rate_tolerance), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE*20 }, 1, INT_MAX, V|E}, | ||||
| {"flags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, {.dbl = DEFAULT }, 0, UINT_MAX, V|A|E|D, "flags"}, | {"flags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, {.dbl = DEFAULT }, 0, UINT_MAX, V|A|E|D, "flags"}, | ||||
| {"mv4", "use four motion vector by macroblock (mpeg4)", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, "flags"}, | {"mv4", "use four motion vector by macroblock (mpeg4)", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, "flags"}, | ||||
| @@ -413,7 +415,9 @@ static const AVOption options[]={ | |||||
| #if FF_API_REQUEST_CHANNELS | #if FF_API_REQUEST_CHANNELS | ||||
| {"request_channels", "set desired number of audio channels", OFFSET(request_channels), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, 0, INT_MAX, A|D}, | {"request_channels", "set desired number of audio channels", OFFSET(request_channels), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, 0, INT_MAX, A|D}, | ||||
| #endif | #endif | ||||
| #if FF_API_DRC_SCALE | |||||
| {"drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), FF_OPT_TYPE_FLOAT, {.dbl = 1.0 }, 0.0, 1.0, A|D}, | {"drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), FF_OPT_TYPE_FLOAT, {.dbl = 1.0 }, 0.0, 1.0, A|D}, | ||||
| #endif | |||||
| {"reservoir", "use bit reservoir", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_BIT_RESERVOIR }, INT_MIN, INT_MAX, A|E, "flags2"}, | {"reservoir", "use bit reservoir", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_BIT_RESERVOIR }, INT_MIN, INT_MAX, A|E, "flags2"}, | ||||
| {"mbtree", "use macroblock tree ratecontrol (x264 only)", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_MBTREE }, INT_MIN, INT_MAX, V|E, "flags2"}, | {"mbtree", "use macroblock tree ratecontrol (x264 only)", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_MBTREE }, INT_MIN, INT_MAX, V|E, "flags2"}, | ||||
| {"bits_per_raw_sample", NULL, OFFSET(bits_per_raw_sample), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | {"bits_per_raw_sample", NULL, OFFSET(bits_per_raw_sample), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| @@ -522,6 +526,15 @@ int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec){ | |||||
| av_opt_set_defaults(s->priv_data); | av_opt_set_defaults(s->priv_data); | ||||
| } | } | ||||
| } | } | ||||
| if (codec && codec->defaults) { | |||||
| int ret; | |||||
| AVCodecDefault *d = codec->defaults; | |||||
| while (d->key) { | |||||
| ret = av_set_string3(s, d->key, d->value, 0, NULL); | |||||
| av_assert0(ret >= 0); | |||||
| d++; | |||||
| } | |||||
| } | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -538,6 +551,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec){ | |||||
| return avctx; | return avctx; | ||||
| } | } | ||||
| #if FF_API_ALLOC_CONTEXT | |||||
| AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ | AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ | ||||
| AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); | AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); | ||||
| @@ -547,14 +561,17 @@ AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ | |||||
| return avctx; | return avctx; | ||||
| } | } | ||||
| #endif | |||||
| void avcodec_get_context_defaults(AVCodecContext *s){ | void avcodec_get_context_defaults(AVCodecContext *s){ | ||||
| avcodec_get_context_defaults2(s, AVMEDIA_TYPE_UNKNOWN); | avcodec_get_context_defaults2(s, AVMEDIA_TYPE_UNKNOWN); | ||||
| } | } | ||||
| #if FF_API_ALLOC_CONTEXT | |||||
| AVCodecContext *avcodec_alloc_context(void){ | AVCodecContext *avcodec_alloc_context(void){ | ||||
| return avcodec_alloc_context2(AVMEDIA_TYPE_UNKNOWN); | return avcodec_alloc_context2(AVMEDIA_TYPE_UNKNOWN); | ||||
| } | } | ||||
| #endif | |||||
| int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src) | int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src) | ||||
| { | { | ||||
| @@ -32,6 +32,7 @@ | |||||
| #include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
| #include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
| #include "libavutil/samplefmt.h" | #include "libavutil/samplefmt.h" | ||||
| #include "libavutil/dict.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| @@ -485,9 +486,20 @@ static void avcodec_get_subtitle_defaults(AVSubtitle *sub) | |||||
| sub->pts = AV_NOPTS_VALUE; | sub->pts = AV_NOPTS_VALUE; | ||||
| } | } | ||||
| #if FF_API_AVCODEC_OPEN | |||||
| int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | ||||
| { | |||||
| return avcodec_open2(avctx, codec, NULL); | |||||
| } | |||||
| #endif | |||||
| int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) | |||||
| { | { | ||||
| int ret = 0; | int ret = 0; | ||||
| AVDictionary *tmp = NULL; | |||||
| if (options) | |||||
| av_dict_copy(&tmp, *options, 0); | |||||
| /* If there is a user-supplied mutex locking routine, call it. */ | /* If there is a user-supplied mutex locking routine, call it. */ | ||||
| if (ff_lockmgr_cb) { | if (ff_lockmgr_cb) { | ||||
| @@ -514,14 +526,18 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | |||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto end; | goto end; | ||||
| } | } | ||||
| if(codec->priv_class){ //this can be droped once all user apps use avcodec_get_context_defaults3() | |||||
| if (codec->priv_class) { | |||||
| *(AVClass**)avctx->priv_data= codec->priv_class; | *(AVClass**)avctx->priv_data= codec->priv_class; | ||||
| av_opt_set_defaults(avctx->priv_data); | av_opt_set_defaults(avctx->priv_data); | ||||
| } | } | ||||
| } | } | ||||
| if (codec->priv_class && (ret = av_opt_set_dict(avctx->priv_data, &tmp) < 0)) | |||||
| goto free_and_end; | |||||
| } else { | } else { | ||||
| avctx->priv_data = NULL; | avctx->priv_data = NULL; | ||||
| } | } | ||||
| if ((ret = av_opt_set_dict(avctx, &tmp)) < 0) | |||||
| goto free_and_end; | |||||
| if(avctx->coded_width && avctx->coded_height) | if(avctx->coded_width && avctx->coded_height) | ||||
| avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | ||||
| @@ -640,8 +656,14 @@ end: | |||||
| if (ff_lockmgr_cb) { | if (ff_lockmgr_cb) { | ||||
| (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | ||||
| } | } | ||||
| if (options) { | |||||
| av_dict_free(options); | |||||
| *options = tmp; | |||||
| } | |||||
| return ret; | return ret; | ||||
| free_and_end: | free_and_end: | ||||
| av_dict_free(&tmp); | |||||
| av_freep(&avctx->priv_data); | av_freep(&avctx->priv_data); | ||||
| avctx->codec= NULL; | avctx->codec= NULL; | ||||
| goto end; | goto end; | ||||
| @@ -68,5 +68,14 @@ | |||||
| #ifndef FF_API_GET_PIX_FMT_NAME | #ifndef FF_API_GET_PIX_FMT_NAME | ||||
| #define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54) | #define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54) | ||||
| #endif | #endif | ||||
| #ifndef FF_API_ALLOC_CONTEXT | |||||
| #define FF_API_ALLOC_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
| #endif | |||||
| #ifndef FF_API_AVCODEC_OPEN | |||||
| #define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
| #endif | |||||
| #ifndef FF_API_DRC_SCALE | |||||
| #define FF_API_DRC_SCALE (LIBAVCODEC_VERSION_MAJOR < 54) | |||||
| #endif | |||||
| #endif /* AVCODEC_VERSION_H */ | #endif /* AVCODEC_VERSION_H */ | ||||
| @@ -1783,7 +1783,7 @@ static void gmc_mmx(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int o | |||||
| int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height) | int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height) | ||||
| { | { | ||||
| gmc(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r, | gmc(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r, | ||||
| width, height, &ff_emulated_edge_mc); | |||||
| width, height, &ff_emulated_edge_mc_8); | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -141,4 +141,6 @@ OBJS-$(CONFIG_MP_FILTER) += libmpcodecs/pullup.o | |||||
| DIRS = x86 libmpcodecs | DIRS = x86 libmpcodecs | ||||
| TOOLS = graph2dot lavfi-showfiltfmts | |||||
| include $(SRC_PATH)/subdir.mak | include $(SRC_PATH)/subdir.mak | ||||
| @@ -97,7 +97,7 @@ static int movie_init(AVFilterContext *ctx) | |||||
| "Failed to avformat_open_input '%s'\n", movie->file_name); | "Failed to avformat_open_input '%s'\n", movie->file_name); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| if ((ret = av_find_stream_info(movie->format_ctx)) < 0) | |||||
| if ((ret = avformat_find_stream_info(movie->format_ctx, NULL)) < 0) | |||||
| av_log(ctx, AV_LOG_WARNING, "Failed to find stream info\n"); | av_log(ctx, AV_LOG_WARNING, "Failed to find stream info\n"); | ||||
| // if seeking requested, we execute it | // if seeking requested, we execute it | ||||
| @@ -140,7 +140,7 @@ static int movie_init(AVFilterContext *ctx) | |||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| if ((ret = avcodec_open(movie->codec_ctx, codec)) < 0) { | |||||
| if ((ret = avcodec_open2(movie->codec_ctx, codec, NULL)) < 0) { | |||||
| av_log(ctx, AV_LOG_ERROR, "Failed to open codec\n"); | av_log(ctx, AV_LOG_ERROR, "Failed to open codec\n"); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -342,5 +342,6 @@ OBJS-$(CONFIG_ALSA_INDEV) += timefilter.o | |||||
| OBJS-$(CONFIG_JACK_INDEV) += timefilter.o | OBJS-$(CONFIG_JACK_INDEV) += timefilter.o | ||||
| TESTPROGS = timefilter | TESTPROGS = timefilter | ||||
| TOOLS = pktdumper probetest | |||||
| include $(SRC_PATH)/subdir.mak | include $(SRC_PATH)/subdir.mak | ||||
| @@ -1167,6 +1167,7 @@ AVFormatContext *avformat_alloc_output_context(const char *format, | |||||
| int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, | int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, | ||||
| const char *format_name, const char *filename); | const char *format_name, const char *filename); | ||||
| #if FF_API_FORMAT_PARAMETERS | |||||
| /** | /** | ||||
| * Read packets of a media file to get stream information. This | * Read packets of a media file to get stream information. This | ||||
| * is useful for file formats with no headers such as MPEG. This | * is useful for file formats with no headers such as MPEG. This | ||||
| @@ -1179,8 +1180,34 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma | |||||
| * @return >=0 if OK, AVERROR_xxx on error | * @return >=0 if OK, AVERROR_xxx on error | ||||
| * @todo Let the user decide somehow what information is needed so that | * @todo Let the user decide somehow what information is needed so that | ||||
| * we do not waste time getting stuff the user does not need. | * we do not waste time getting stuff the user does not need. | ||||
| * | |||||
| * @deprecated use avformat_find_stream_info. | |||||
| */ | */ | ||||
| int av_find_stream_info(AVFormatContext *ic); | int av_find_stream_info(AVFormatContext *ic); | ||||
| #endif | |||||
| /** | |||||
| * Read packets of a media file to get stream information. This | |||||
| * is useful for file formats with no headers such as MPEG. This | |||||
| * function also computes the real framerate in case of MPEG-2 repeat | |||||
| * frame mode. | |||||
| * The logical file position is not changed by this function; | |||||
| * examined packets may be buffered for later processing. | |||||
| * | |||||
| * @param ic media file handle | |||||
| * @param options If non-NULL, an ic.nb_streams long array of pointers to | |||||
| * dictionaries, where i-th member contains options for | |||||
| * codec corresponding to i-th stream. | |||||
| * On return each dictionary will be filled with options that were not found. | |||||
| * @return >=0 if OK, AVERROR_xxx on error | |||||
| * | |||||
| * @note this function isn't guaranteed to open all the codecs, so | |||||
| * options being non-empty at return is a perfectly normal behavior. | |||||
| * | |||||
| * @todo Let the user decide somehow what information is needed so that | |||||
| * we do not waste time getting stuff the user does not need. | |||||
| */ | |||||
| int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); | |||||
| /** | /** | ||||
| * Find the "best" stream in the file. | * Find the "best" stream in the file. | ||||
| @@ -255,6 +255,9 @@ typedef struct { | |||||
| /* What to skip before effectively reading a packet. */ | /* What to skip before effectively reading a packet. */ | ||||
| int skip_to_keyframe; | int skip_to_keyframe; | ||||
| uint64_t skip_to_timecode; | uint64_t skip_to_timecode; | ||||
| /* File has a CUES element, but we defer parsing until it is needed. */ | |||||
| int cues_parsing_deferred; | |||||
| } MatroskaDemuxContext; | } MatroskaDemuxContext; | ||||
| typedef struct { | typedef struct { | ||||
| @@ -1139,7 +1142,7 @@ static void matroska_convert_tags(AVFormatContext *s) | |||||
| } | } | ||||
| } | } | ||||
| static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) | |||||
| static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int idx) | |||||
| { | { | ||||
| EbmlList *seekhead_list = &matroska->seekhead; | EbmlList *seekhead_list = &matroska->seekhead; | ||||
| MatroskaSeekhead *seekhead = seekhead_list->elem; | MatroskaSeekhead *seekhead = seekhead_list->elem; | ||||
| @@ -1147,6 +1150,54 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) | |||||
| int64_t before_pos = avio_tell(matroska->ctx->pb); | int64_t before_pos = avio_tell(matroska->ctx->pb); | ||||
| uint32_t saved_id = matroska->current_id; | uint32_t saved_id = matroska->current_id; | ||||
| MatroskaLevel level; | MatroskaLevel level; | ||||
| int64_t offset; | |||||
| int ret = 0; | |||||
| if (idx >= seekhead_list->nb_elem | |||||
| || seekhead[idx].id == MATROSKA_ID_SEEKHEAD | |||||
| || seekhead[idx].id == MATROSKA_ID_CLUSTER) | |||||
| return 0; | |||||
| /* seek */ | |||||
| offset = seekhead[idx].pos + matroska->segment_start; | |||||
| if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) == offset) { | |||||
| /* We don't want to lose our seekhead level, so we add | |||||
| * a dummy. This is a crude hack. */ | |||||
| if (matroska->num_levels == EBML_MAX_DEPTH) { | |||||
| av_log(matroska->ctx, AV_LOG_INFO, | |||||
| "Max EBML element depth (%d) reached, " | |||||
| "cannot parse further.\n", EBML_MAX_DEPTH); | |||||
| ret = AVERROR_INVALIDDATA; | |||||
| } else { | |||||
| level.start = 0; | |||||
| level.length = (uint64_t)-1; | |||||
| matroska->levels[matroska->num_levels] = level; | |||||
| matroska->num_levels++; | |||||
| matroska->current_id = 0; | |||||
| ebml_parse(matroska, matroska_segment, matroska); | |||||
| /* remove dummy level */ | |||||
| while (matroska->num_levels) { | |||||
| uint64_t length = matroska->levels[--matroska->num_levels].length; | |||||
| if (length == (uint64_t)-1) | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| /* seek back */ | |||||
| avio_seek(matroska->ctx->pb, before_pos, SEEK_SET); | |||||
| matroska->level_up = level_up; | |||||
| matroska->current_id = saved_id; | |||||
| return ret; | |||||
| } | |||||
| static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) | |||||
| { | |||||
| EbmlList *seekhead_list = &matroska->seekhead; | |||||
| MatroskaSeekhead *seekhead = seekhead_list->elem; | |||||
| int64_t before_pos = avio_tell(matroska->ctx->pb); | |||||
| int i; | int i; | ||||
| // we should not do any seeking in the streaming case | // we should not do any seeking in the streaming case | ||||
| @@ -1154,47 +1205,55 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) | |||||
| (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)) | (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)) | ||||
| return; | return; | ||||
| for (i=0; i<seekhead_list->nb_elem; i++) { | |||||
| int64_t offset = seekhead[i].pos + matroska->segment_start; | |||||
| if (seekhead[i].pos <= before_pos | |||||
| || seekhead[i].id == MATROSKA_ID_SEEKHEAD | |||||
| || seekhead[i].id == MATROSKA_ID_CLUSTER) | |||||
| for (i = 0; i < seekhead_list->nb_elem; i++) { | |||||
| if (seekhead[i].pos <= before_pos) | |||||
| continue; | continue; | ||||
| /* seek */ | |||||
| if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) != offset) | |||||
| // defer cues parsing until we actually need cue data. | |||||
| if (seekhead[i].id == MATROSKA_ID_CUES) { | |||||
| matroska->cues_parsing_deferred = 1; | |||||
| continue; | continue; | ||||
| } | |||||
| /* We don't want to lose our seekhead level, so we add | |||||
| * a dummy. This is a crude hack. */ | |||||
| if (matroska->num_levels == EBML_MAX_DEPTH) { | |||||
| av_log(matroska->ctx, AV_LOG_INFO, | |||||
| "Max EBML element depth (%d) reached, " | |||||
| "cannot parse further.\n", EBML_MAX_DEPTH); | |||||
| if (matroska_parse_seekhead_entry(matroska, i) < 0) | |||||
| break; | break; | ||||
| } | |||||
| } | |||||
| } | |||||
| level.start = 0; | |||||
| level.length = (uint64_t)-1; | |||||
| matroska->levels[matroska->num_levels] = level; | |||||
| matroska->num_levels++; | |||||
| matroska->current_id = 0; | |||||
| static void matroska_parse_cues(MatroskaDemuxContext *matroska) { | |||||
| EbmlList *seekhead_list = &matroska->seekhead; | |||||
| MatroskaSeekhead *seekhead = seekhead_list->elem; | |||||
| EbmlList *index_list; | |||||
| MatroskaIndex *index; | |||||
| int index_scale = 1; | |||||
| int i, j; | |||||
| ebml_parse(matroska, matroska_segment, matroska); | |||||
| for (i = 0; i < seekhead_list->nb_elem; i++) | |||||
| if (seekhead[i].id == MATROSKA_ID_CUES) | |||||
| break; | |||||
| assert(i <= seekhead_list->nb_elem); | |||||
| /* remove dummy level */ | |||||
| while (matroska->num_levels) { | |||||
| uint64_t length = matroska->levels[--matroska->num_levels].length; | |||||
| if (length == (uint64_t)-1) | |||||
| break; | |||||
| matroska_parse_seekhead_entry(matroska, i); | |||||
| index_list = &matroska->index; | |||||
| index = index_list->elem; | |||||
| if (index_list->nb_elem | |||||
| && index[0].time > 1E14/matroska->time_scale) { | |||||
| av_log(matroska->ctx, AV_LOG_WARNING, "Working around broken index.\n"); | |||||
| index_scale = matroska->time_scale; | |||||
| } | |||||
| for (i = 0; i < index_list->nb_elem; i++) { | |||||
| EbmlList *pos_list = &index[i].pos; | |||||
| MatroskaIndexPos *pos = pos_list->elem; | |||||
| for (j = 0; j < pos_list->nb_elem; j++) { | |||||
| MatroskaTrack *track = matroska_find_track_by_num(matroska, pos[j].track); | |||||
| if (track && track->stream) | |||||
| av_add_index_entry(track->stream, | |||||
| pos[j].pos + matroska->segment_start, | |||||
| index[i].time/index_scale, 0, 0, | |||||
| AVINDEX_KEYFRAME); | |||||
| } | } | ||||
| } | } | ||||
| /* seek back */ | |||||
| avio_seek(matroska->ctx->pb, before_pos, SEEK_SET); | |||||
| matroska->level_up = level_up; | |||||
| matroska->current_id = saved_id; | |||||
| } | } | ||||
| static int matroska_aac_profile(char *codec_id) | static int matroska_aac_profile(char *codec_id) | ||||
| @@ -1226,9 +1285,6 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| EbmlList *chapters_list = &matroska->chapters; | EbmlList *chapters_list = &matroska->chapters; | ||||
| MatroskaChapter *chapters; | MatroskaChapter *chapters; | ||||
| MatroskaTrack *tracks; | MatroskaTrack *tracks; | ||||
| EbmlList *index_list; | |||||
| MatroskaIndex *index; | |||||
| int index_scale = 1; | |||||
| uint64_t max_start = 0; | uint64_t max_start = 0; | ||||
| Ebml ebml = { 0 }; | Ebml ebml = { 0 }; | ||||
| AVStream *st; | AVStream *st; | ||||
| @@ -1587,27 +1643,6 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| max_start = chapters[i].start; | max_start = chapters[i].start; | ||||
| } | } | ||||
| index_list = &matroska->index; | |||||
| index = index_list->elem; | |||||
| if (index_list->nb_elem | |||||
| && index[0].time > 100000000000000/matroska->time_scale) { | |||||
| av_log(matroska->ctx, AV_LOG_WARNING, "Working around broken index.\n"); | |||||
| index_scale = matroska->time_scale; | |||||
| } | |||||
| for (i=0; i<index_list->nb_elem; i++) { | |||||
| EbmlList *pos_list = &index[i].pos; | |||||
| MatroskaIndexPos *pos = pos_list->elem; | |||||
| for (j=0; j<pos_list->nb_elem; j++) { | |||||
| MatroskaTrack *track = matroska_find_track_by_num(matroska, | |||||
| pos[j].track); | |||||
| if (track && track->stream) | |||||
| av_add_index_entry(track->stream, | |||||
| pos[j].pos + matroska->segment_start, | |||||
| index[i].time/index_scale, 0, 0, | |||||
| AVINDEX_KEYFRAME); | |||||
| } | |||||
| } | |||||
| matroska_convert_tags(s); | matroska_convert_tags(s); | ||||
| return 0; | return 0; | ||||
| @@ -1954,6 +1989,12 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, | |||||
| AVStream *st = s->streams[stream_index]; | AVStream *st = s->streams[stream_index]; | ||||
| int i, index, index_sub, index_min; | int i, index, index_sub, index_min; | ||||
| /* Parse the CUES now since we need the index data to seek. */ | |||||
| if (matroska->cues_parsing_deferred) { | |||||
| matroska_parse_cues(matroska); | |||||
| matroska->cues_parsing_deferred = 0; | |||||
| } | |||||
| if (!st->nb_index_entries) | if (!st->nb_index_entries) | ||||
| return 0; | return 0; | ||||
| timestamp = FFMAX(timestamp, st->index_entries[0].timestamp); | timestamp = FFMAX(timestamp, st->index_entries[0].timestamp); | ||||
| @@ -2115,7 +2115,7 @@ static void mov_create_chapter_track(AVFormatContext *s, int tracknum) | |||||
| track->mode = mov->mode; | track->mode = mov->mode; | ||||
| track->tag = MKTAG('t','e','x','t'); | track->tag = MKTAG('t','e','x','t'); | ||||
| track->timescale = MOV_TIMESCALE; | track->timescale = MOV_TIMESCALE; | ||||
| track->enc = avcodec_alloc_context(); | |||||
| track->enc = avcodec_alloc_context3(NULL); | |||||
| track->enc->codec_type = AVMEDIA_TYPE_SUBTITLE; | track->enc->codec_type = AVMEDIA_TYPE_SUBTITLE; | ||||
| for (i = 0; i < s->nb_chapters; i++) { | for (i = 0; i < s->nb_chapters; i++) { | ||||
| @@ -36,7 +36,7 @@ int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index) | |||||
| track->tag = MKTAG('r','t','p',' '); | track->tag = MKTAG('r','t','p',' '); | ||||
| track->src_track = src_index; | track->src_track = src_index; | ||||
| track->enc = avcodec_alloc_context(); | |||||
| track->enc = avcodec_alloc_context3(NULL); | |||||
| if (!track->enc) | if (!track->enc) | ||||
| goto fail; | goto fail; | ||||
| track->enc->codec_type = AVMEDIA_TYPE_DATA; | track->enc->codec_type = AVMEDIA_TYPE_DATA; | ||||
| @@ -2113,7 +2113,7 @@ static int has_decode_delay_been_guessed(AVStream *st) | |||||
| st->codec_info_nb_frames >= 6 + st->codec->has_b_frames; | st->codec_info_nb_frames >= 6 + st->codec->has_b_frames; | ||||
| } | } | ||||
| static int try_decode_frame(AVStream *st, AVPacket *avpkt) | |||||
| static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options) | |||||
| { | { | ||||
| int16_t *samples; | int16_t *samples; | ||||
| AVCodec *codec; | AVCodec *codec; | ||||
| @@ -2124,7 +2124,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt) | |||||
| codec = avcodec_find_decoder(st->codec->codec_id); | codec = avcodec_find_decoder(st->codec->codec_id); | ||||
| if (!codec) | if (!codec) | ||||
| return -1; | return -1; | ||||
| ret = avcodec_open(st->codec, codec); | |||||
| ret = avcodec_open2(st->codec, codec, options); | |||||
| if (ret < 0) | if (ret < 0) | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -2243,12 +2243,20 @@ static int tb_unreliable(AVCodecContext *c){ | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #if FF_API_FORMAT_PARAMETERS | |||||
| int av_find_stream_info(AVFormatContext *ic) | int av_find_stream_info(AVFormatContext *ic) | ||||
| { | |||||
| return avformat_find_stream_info(ic, NULL); | |||||
| } | |||||
| #endif | |||||
| int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) | |||||
| { | { | ||||
| int i, count, ret, read_size, j; | int i, count, ret, read_size, j; | ||||
| AVStream *st; | AVStream *st; | ||||
| AVPacket pkt1, *pkt; | AVPacket pkt1, *pkt; | ||||
| int64_t old_offset = avio_tell(ic->pb); | int64_t old_offset = avio_tell(ic->pb); | ||||
| int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those | |||||
| for(i=0;i<ic->nb_streams;i++) { | for(i=0;i<ic->nb_streams;i++) { | ||||
| AVCodec *codec; | AVCodec *codec; | ||||
| @@ -2274,12 +2282,12 @@ int av_find_stream_info(AVFormatContext *ic) | |||||
| /* Ensure that subtitle_header is properly set. */ | /* Ensure that subtitle_header is properly set. */ | ||||
| if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE | if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE | ||||
| && codec && !st->codec->codec) | && codec && !st->codec->codec) | ||||
| avcodec_open(st->codec, codec); | |||||
| avcodec_open2(st->codec, codec, options ? &options[i] : NULL); | |||||
| //try to just open decoders, in case this is enough to get parameters | //try to just open decoders, in case this is enough to get parameters | ||||
| if(!has_codec_parameters(st->codec)){ | if(!has_codec_parameters(st->codec)){ | ||||
| if (codec && !st->codec->codec) | if (codec && !st->codec->codec) | ||||
| avcodec_open(st->codec, codec); | |||||
| avcodec_open2(st->codec, codec, options ? &options[i] : NULL); | |||||
| } | } | ||||
| } | } | ||||
| @@ -2423,7 +2431,7 @@ int av_find_stream_info(AVFormatContext *ic) | |||||
| !has_decode_delay_been_guessed(st) || | !has_decode_delay_been_guessed(st) || | ||||
| (st->codec->codec && | (st->codec->codec && | ||||
| st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) | st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) | ||||
| try_decode_frame(st, pkt); | |||||
| try_decode_frame(st, pkt, (options && i <= orig_nb_streams )? &options[i] : NULL); | |||||
| st->codec_info_nb_frames++; | st->codec_info_nb_frames++; | ||||
| count++; | count++; | ||||
| @@ -2703,7 +2711,7 @@ AVStream *av_new_stream(AVFormatContext *s, int id) | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| st->codec= avcodec_alloc_context(); | |||||
| st->codec = avcodec_alloc_context3(NULL); | |||||
| if (s->iformat) { | if (s->iformat) { | ||||
| /* no default bitrate if decoding */ | /* no default bitrate if decoding */ | ||||
| st->codec->bit_rate = 0; | st->codec->bit_rate = 0; | ||||
| @@ -347,10 +347,13 @@ typedef struct SwsContext { | |||||
| DECLARE_ALIGNED(8, uint64_t, v_temp); | DECLARE_ALIGNED(8, uint64_t, v_temp); | ||||
| DECLARE_ALIGNED(8, uint64_t, y_temp); | DECLARE_ALIGNED(8, uint64_t, y_temp); | ||||
| int32_t alpMmxFilter[4*MAX_FILTER_SIZE]; | int32_t alpMmxFilter[4*MAX_FILTER_SIZE]; | ||||
| // alignment of these values is not necessary, but merely here | |||||
| // to maintain the same offset across x8632 and x86-64. Once we | |||||
| // use proper offset macros in the asm, they can be removed. | |||||
| DECLARE_ALIGNED(8, ptrdiff_t, uv_off); ///< offset (in pixels) between u and v planes | DECLARE_ALIGNED(8, ptrdiff_t, uv_off); ///< offset (in pixels) between u and v planes | ||||
| DECLARE_ALIGNED(8, ptrdiff_t, uv_offx2); ///< offset (in bytes) between u and v planes | DECLARE_ALIGNED(8, ptrdiff_t, uv_offx2); ///< offset (in bytes) between u and v planes | ||||
| uint16_t dither16[8]; | |||||
| uint32_t dither32[8]; | |||||
| DECLARE_ALIGNED(8, uint16_t, dither16)[8]; | |||||
| DECLARE_ALIGNED(8, uint32_t, dither32)[8]; | |||||
| const uint8_t *chrDither8, *lumDither8; | const uint8_t *chrDither8, *lumDither8; | ||||
| @@ -34,7 +34,7 @@ install-libs-$(CONFIG_STATIC): install-lib$(NAME)-static | |||||
| install-libs-$(CONFIG_SHARED): install-lib$(NAME)-shared | install-libs-$(CONFIG_SHARED): install-lib$(NAME)-shared | ||||
| define RULES | define RULES | ||||
| $(SUBDIR)%$(EXESUF): $(SUBDIR)%.o | |||||
| $(TESTPROGS) $(TOOLS): %$(EXESUF): %.o | |||||
| $$(LD) $(FFLDFLAGS) -o $$@ $$^ -l$(FULLNAME) $(FFEXTRALIBS) $$(ELIBS) | $$(LD) $(FFLDFLAGS) -o $$@ $$^ -l$(FULLNAME) $(FFEXTRALIBS) $$(ELIBS) | ||||
| $(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR) | $(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR) | ||||
| @@ -96,7 +96,7 @@ endef | |||||
| $(eval $(RULES)) | $(eval $(RULES)) | ||||
| $(EXAMPLES) $(TESTPROGS): $(THIS_LIB) $(DEP_LIBS) | |||||
| $(EXAMPLES) $(TESTPROGS) $(TOOLS): $(THIS_LIB) $(DEP_LIBS) | |||||
| examples: $(EXAMPLES) | examples: $(EXAMPLES) | ||||
| testprogs: $(TESTPROGS) | testprogs: $(TESTPROGS) | ||||
| @@ -31,9 +31,6 @@ tests/data/asynth1.sw tests/vsynth%/00.pgm: TAG = GEN | |||||
| tests/seek_test$(EXESUF): tests/seek_test.o $(FF_DEP_LIBS) | tests/seek_test$(EXESUF): tests/seek_test.o $(FF_DEP_LIBS) | ||||
| $(LD) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS) | $(LD) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS) | ||||
| tools/lavfi-showfiltfmts$(EXESUF): tools/lavfi-showfiltfmts.o $(FF_DEP_LIBS) | |||||
| $(LD) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS) | |||||
| include $(SRC_PATH)/tests/fate.mak | include $(SRC_PATH)/tests/fate.mak | ||||
| include $(SRC_PATH)/tests/fate2.mak | include $(SRC_PATH)/tests/fate2.mak | ||||
| @@ -14,7 +14,7 @@ eval do_$test=y | |||||
| do_lavf() | do_lavf() | ||||
| { | { | ||||
| file=${outfile}lavf.$1 | file=${outfile}lavf.$1 | ||||
| do_ffmpeg $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 $2 | |||||
| do_ffmpeg $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -ab 64k -t 1 -qscale 10 $2 | |||||
| do_ffmpeg_crc $file $DEC_OPTS -i $target_path/$file $3 | do_ffmpeg_crc $file $DEC_OPTS -i $target_path/$file $3 | ||||
| } | } | ||||
| @@ -53,7 +53,7 @@ fi | |||||
| if [ -n "$do_rm" ] ; then | if [ -n "$do_rm" ] ; then | ||||
| file=${outfile}lavf.rm | file=${outfile}lavf.rm | ||||
| do_ffmpeg $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 -acodec ac3_fixed | |||||
| do_ffmpeg $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 -acodec ac3_fixed -ab 64k | |||||
| # broken | # broken | ||||
| #do_ffmpeg_crc $file -i $target_path/$file | #do_ffmpeg_crc $file -i $target_path/$file | ||||
| fi | fi | ||||