Merge commit '142e76f1055de5dde44696e71a5f63f2cb11dedf'

* 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>
This commit is contained in:
Michael Niedermayer 2011-07-11 04:23:25 +02:00
commit 3602ad7ee6
37 changed files with 360 additions and 164 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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)) $(OBJS): | $(sort $(dir $(OBJS)))
$(HOSTOBJS): | $(dir $(HOSTOBJS)) $(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
$(TESTOBJS): | $(dir $(TESTOBJS)) $(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
$(TOOLOBJS): | tools
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS)) OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS))

2
configure vendored
View File

@ -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

View File

@ -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)

View File

@ -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);
} }

View File

@ -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));
} }

View File

@ -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

View File

@ -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

View File

@ -349,9 +349,7 @@ function ff_fft_permute_neon, export=1
pop {r4,pc} pop {r4,pc}
endfunc endfunc
.section .rodata const fft_tab_neon
.align 4
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 const pmmp, align=4
pmmp: .float +1.0, -1.0, -1.0, +1.0 .float +1.0, -1.0, -1.0, +1.0
mppm: .float -M_SQRT1_2, M_SQRT1_2, M_SQRT1_2, -M_SQRT1_2 endconst
const mppm, align=4
.float -M_SQRT1_2, M_SQRT1_2, M_SQRT1_2, -M_SQRT1_2
endconst

View File

@ -383,8 +383,8 @@ function ff_h264_idct8_add4_neon, export=1
pop {r4-r8,pc} pop {r4-r8,pc}
endfunc endfunc
.section .rodata const scan8
scan8: .byte 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8 .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

View File

@ -166,12 +166,9 @@ function ff_pred16x16_plane_neon, export=1
bx lr bx lr
endfunc endfunc
.section .rodata const p16weight, align=4
.align 4
p16weight:
.short 1,2,3,4,5,6,7,8 .short 1,2,3,4,5,6,7,8
endconst
.text
function ff_pred8x8_hor_neon, export=1 function ff_pred8x8_hor_neon, export=1
sub r2, r0, #1 sub r2, r0, #1

View File

@ -243,10 +243,9 @@ function idct_col4_st8_neon
bx lr bx lr
endfunc endfunc
.section .rodata const idct_coeff_neon, align=4
.align 4
idct_coeff_neon:
.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}

View File

@ -20,11 +20,9 @@
#include "asm.S" #include "asm.S"
.section .rodata const vp3_idct_constants, align=4
.align 4
vp3_idct_constants:
.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

View File

@ -240,9 +240,9 @@ A orrcs r8, r8, r10, lsl r6
b 5b b 5b
endfunc endfunc
.section .rodata const zigzag_scan
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

View File

@ -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.

View File

@ -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)

View File

@ -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);

View File

@ -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.
*/ */

View File

@ -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++) {

View File

@ -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++){

View File

@ -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)
{ {

View File

@ -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;

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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

View File

@ -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.

View 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++) { for (i = 0; i < seekhead_list->nb_elem; i++) {
int64_t offset = seekhead[i].pos + matroska->segment_start; if (seekhead[i].pos <= before_pos)
if (seekhead[i].pos <= before_pos
|| seekhead[i].id == MATROSKA_ID_SEEKHEAD
|| seekhead[i].id == MATROSKA_ID_CLUSTER)
continue; continue;
/* seek */ // defer cues parsing until we actually need cue data.
if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) != offset) 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);
break;
} }
level.start = 0; if (matroska_parse_seekhead_entry(matroska, i) < 0)
level.length = (uint64_t)-1; break;
matroska->levels[matroska->num_levels] = level; }
matroska->num_levels++; }
matroska->current_id = 0;
ebml_parse(matroska, matroska_segment, matroska); 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;
/* remove dummy level */ for (i = 0; i < seekhead_list->nb_elem; i++)
while (matroska->num_levels) { if (seekhead[i].id == MATROSKA_ID_CUES)
uint64_t length = matroska->levels[--matroska->num_levels].length; break;
if (length == (uint64_t)-1) assert(i <= seekhead_list->nb_elem);
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);

View File

@ -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++) {

View File

@ -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;

View File

@ -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;

View File

@ -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]; DECLARE_ALIGNED(8, uint16_t, dither16)[8];
uint32_t dither32[8]; DECLARE_ALIGNED(8, uint32_t, dither32)[8];
const uint8_t *chrDither8, *lumDither8; const uint8_t *chrDither8, *lumDither8;

View File

@ -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)

View File

@ -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

View File

@ -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