* qatar/master: build: remove empty $(OBJS) target build: make rule for linking ff* apply only to these targets build: rearrange some lines in a more logical way s302m: fix resampling for 16 and 24bits. ARM: remove MUL64 and MAC64 inline asm build: clean up .PHONY lists build: move all (un)install* target aliases to toplevel Makefile flvenc: propagate error properly build: remove stale dependency build: do not add CFLAGS-yes to CFLAGS utils.c: fix crash with threading enabled. configure: simplify source_path setup configure: remove --source-path option lavf: deprecate AVFormatParameters.time_base. img2: add framerate private option. img2: add video_size private option. img2: add pixel_format private option. tty: add framerate private option. Conflicts: Makefile configure Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.8
| @@ -80,12 +80,15 @@ endef | |||
| $(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D)))) | |||
| ffplay.o: CFLAGS += $(SDL_CFLAGS) | |||
| ffplay_g$(EXESUF): FF_EXTRALIBS += $(SDL_LIBS) | |||
| ffserver_g$(EXESUF): FF_LDFLAGS += $(FFSERVERLDFLAGS) | |||
| %_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS) | |||
| $(PROGS): %_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS) | |||
| $(LD) $(FF_LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS) | |||
| alltools: $(TOOLS) | |||
| tools/%$(EXESUF): tools/%.o | |||
| $(LD) $(FF_LDFLAGS) -o $@ $< $(FF_EXTRALIBS) | |||
| @@ -95,8 +98,6 @@ tools/%.o: tools/%.c | |||
| -include $(wildcard tools/*.d) | |||
| -include $(wildcard tests/*.d) | |||
| ffplay.o: CFLAGS += $(SDL_CFLAGS) | |||
| VERSION_SH = $(SRC_PATH_BARE)/version.sh | |||
| GIT_LOG = $(SRC_PATH_BARE)/.git/logs/HEAD | |||
| @@ -110,8 +111,6 @@ version.h .version: | |||
| # force version.sh to run whenever version might have changed | |||
| -include .version | |||
| alltools: $(TOOLS) | |||
| DOCS = $(addprefix doc/, developer.html faq.html general.html libavfilter.html) $(HTMLPAGES) $(MANPAGES) $(PODPAGES) | |||
| documentation: $(DOCS) | |||
| @@ -134,7 +133,9 @@ doc/%.1: TAG = MAN | |||
| doc/%.1: doc/%.pod | |||
| $(M)pod2man --section=1 --center=" " --release=" " $< > $@ | |||
| install: $(INSTALL_TARGETS-yes) | |||
| install: install-libs install-headers $(INSTALL_TARGETS-yes) | |||
| install-libs: install-libs-yes | |||
| install-progs: $(PROGS) $(INSTALL_PROGS_TARGETS-yes) | |||
| $(Q)mkdir -p "$(BINDIR)" | |||
| @@ -148,7 +149,7 @@ install-man: $(MANPAGES) | |||
| $(Q)mkdir -p "$(MANDIR)/man1" | |||
| $(INSTALL) -m 644 $(MANPAGES) "$(MANDIR)/man1" | |||
| uninstall: uninstall-progs uninstall-data uninstall-man | |||
| uninstall: uninstall-libs uninstall-headers uninstall-progs uninstall-data uninstall-man | |||
| uninstall-progs: | |||
| $(RM) $(addprefix "$(BINDIR)/", $(ALLPROGS)) | |||
| @@ -293,4 +294,5 @@ $(FATE): ffmpeg$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF)) | |||
| fate-list: | |||
| @printf '%s\n' $(sort $(FATE)) | |||
| .PHONY: documentation *test regtest-* alltools check config | |||
| .PHONY: all alltools *clean check config documentation examples install* | |||
| .PHONY: *test testprogs uninstall* | |||
| @@ -45,8 +45,6 @@ HOSTCFLAGS += $(IFLAGS) | |||
| %.ho: %.h | |||
| $(CC) $(CPPFLAGS) $(CFLAGS) -Wno-unused -c -o $@ -x c $< | |||
| %$(EXESUF): %.c | |||
| %.ver: %.v | |||
| $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@ | |||
| @@ -56,24 +54,14 @@ HOSTCFLAGS += $(IFLAGS) | |||
| %.h: | |||
| @: | |||
| install: install-libs install-headers | |||
| install-libs: install-libs-yes | |||
| uninstall: uninstall-libs uninstall-headers | |||
| .PHONY: all depend dep *clean install* uninstall* examples testprogs | |||
| # Disable suffix rules. Most of the builtin rules are suffix rules, | |||
| # so this saves some time on slow systems. | |||
| .SUFFIXES: | |||
| # Do not delete intermediate files from chains of implicit rules | |||
| $(OBJS): | |||
| endif | |||
| OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes) | |||
| CFLAGS += $(CFLAGS-yes) | |||
| OBJS += $(OBJS-yes) | |||
| FFLIBS := $(FFLIBS-yes) $(FFLIBS) | |||
| TESTPROGS += $(TESTPROGS-yes) | |||
| @@ -192,7 +192,6 @@ External library support: | |||
| --enable-zlib enable zlib [autodetect] | |||
| Advanced options (experts only): | |||
| --source-path=PATH path to source code [$source_path] | |||
| --cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix] | |||
| --enable-cross-compile assume a cross-compiler is used | |||
| --sysroot=PATH root of cross-build tree | |||
| @@ -1190,7 +1189,6 @@ CMDLINE_SET=" | |||
| nm | |||
| pkg_config | |||
| samples | |||
| source_path | |||
| strip | |||
| sysinclude | |||
| sysroot | |||
| @@ -1715,13 +1713,12 @@ DEPEND_CMD='$(DEPCC) $(DEPFLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F) | |||
| DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -MM' | |||
| # find source path | |||
| source_path="$(dirname "$0")" | |||
| enable source_path_used | |||
| if test -f configure; then | |||
| source_path="$(pwd)" | |||
| disable source_path_used | |||
| else | |||
| source_path="$(cd "$source_path"; pwd)" | |||
| source_path=$(cd $(dirname "$0"); pwd) | |||
| enable source_path_used | |||
| echo "$source_path" | grep -q '[[:blank:]]' && | |||
| die "Out of tree builds are impossible with whitespace in source path." | |||
| test -e "$source_path/config.h" && | |||
| @@ -28,45 +28,16 @@ | |||
| #if HAVE_INLINE_ASM | |||
| #define MULH MULH | |||
| #define MUL64 MUL64 | |||
| #if HAVE_ARMV6 | |||
| #define MULH MULH | |||
| static inline av_const int MULH(int a, int b) | |||
| { | |||
| int r; | |||
| __asm__ ("smmul %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); | |||
| return r; | |||
| } | |||
| static inline av_const int64_t MUL64(int a, int b) | |||
| { | |||
| int64_t x; | |||
| __asm__ ("smull %Q0, %R0, %1, %2" : "=r"(x) : "r"(a), "r"(b)); | |||
| return x; | |||
| } | |||
| #else | |||
| static inline av_const int MULH(int a, int b) | |||
| { | |||
| int lo, hi; | |||
| __asm__ ("smull %0, %1, %2, %3" : "=&r"(lo), "=&r"(hi) : "r"(b), "r"(a)); | |||
| return hi; | |||
| } | |||
| static inline av_const int64_t MUL64(int a, int b) | |||
| { | |||
| int64_t x; | |||
| __asm__ ("smull %Q0, %R0, %1, %2" : "=&r"(x) : "r"(a), "r"(b)); | |||
| return x; | |||
| } | |||
| #endif | |||
| static inline av_const int64_t MAC64(int64_t d, int a, int b) | |||
| { | |||
| __asm__ ("smlal %Q0, %R0, %1, %2" : "+r"(d) : "r"(a), "r"(b)); | |||
| return d; | |||
| } | |||
| #define MAC64(d, a, b) ((d) = MAC64(d, a, b)) | |||
| #define MLS64(d, a, b) MAC64(d, -(a), b) | |||
| #if HAVE_ARMV5TE | |||
| @@ -107,7 +107,7 @@ static int s302m_decode_frame(AVCodecContext *avctx, void *data, | |||
| *o++ = (av_reverse[buf[6] & 0xf0] << 28) | | |||
| (av_reverse[buf[5]] << 20) | | |||
| (av_reverse[buf[4]] << 12) | | |||
| (av_reverse[buf[3] & 0x0f] << 8); | |||
| (av_reverse[buf[3] & 0x0f] << 4); | |||
| buf += 7; | |||
| } | |||
| *data_size = (uint8_t*) o - (uint8_t*) data; | |||
| @@ -130,7 +130,7 @@ static int s302m_decode_frame(AVCodecContext *avctx, void *data, | |||
| av_reverse[buf[0]]; | |||
| *o++ = (av_reverse[buf[4] & 0xf0] << 12) | | |||
| (av_reverse[buf[3]] << 4) | | |||
| av_reverse[buf[2] & 0x0f]; | |||
| (av_reverse[buf[2]] >> 4); | |||
| buf += 5; | |||
| } | |||
| *data_size = (uint8_t*) o - (uint8_t*) data; | |||
| @@ -227,8 +227,8 @@ typedef struct AVProbeData { | |||
| #define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer | |||
| typedef struct AVFormatParameters { | |||
| AVRational time_base; | |||
| #if FF_API_FORMAT_PARAMETERS | |||
| attribute_deprecated AVRational time_base; | |||
| attribute_deprecated int sample_rate; | |||
| attribute_deprecated int channels; | |||
| attribute_deprecated int width; | |||
| @@ -440,7 +440,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) | |||
| av_free(data); | |||
| return 0; | |||
| return pb->error; | |||
| } | |||
| AVOutputFormat ff_flv_muxer = { | |||
| @@ -22,12 +22,17 @@ | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "libavutil/avstring.h" | |||
| #include "libavutil/log.h" | |||
| #include "libavutil/opt.h" | |||
| #include "libavutil/pixdesc.h" | |||
| #include "libavutil/parseutils.h" | |||
| #include "avformat.h" | |||
| #include "avio_internal.h" | |||
| #include "internal.h" | |||
| #include <strings.h> | |||
| typedef struct { | |||
| const AVClass *class; /**< Class for private options. */ | |||
| int img_first; | |||
| int img_last; | |||
| int img_number; | |||
| @@ -35,6 +40,9 @@ typedef struct { | |||
| int is_pipe; | |||
| int split_planes; /**< use independent file for each Y, U, V plane */ | |||
| char path[1024]; | |||
| char *pixel_format; /**< Set by a private option. */ | |||
| char *video_size; /**< Set by a private option. */ | |||
| char *framerate; /**< Set by a private option. */ | |||
| } VideoData; | |||
| typedef struct { | |||
| @@ -202,8 +210,11 @@ enum CodecID av_guess_image2_codec(const char *filename){ | |||
| static int read_header(AVFormatContext *s1, AVFormatParameters *ap) | |||
| { | |||
| VideoData *s = s1->priv_data; | |||
| int first_index, last_index; | |||
| int first_index, last_index, ret = 0; | |||
| int width = 0, height = 0; | |||
| AVStream *st; | |||
| enum PixelFormat pix_fmt = PIX_FMT_NONE; | |||
| AVRational framerate; | |||
| s1->ctx_flags |= AVFMTCTX_NOHEADER; | |||
| @@ -212,6 +223,29 @@ static int read_header(AVFormatContext *s1, AVFormatParameters *ap) | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| if (s->pixel_format && (pix_fmt = av_get_pix_fmt(s->pixel_format)) == PIX_FMT_NONE) { | |||
| av_log(s1, AV_LOG_ERROR, "No such pixel format: %s.\n", s->pixel_format); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| if (s->video_size && (ret = av_parse_video_size(&width, &height, s->video_size)) < 0) { | |||
| av_log(s, AV_LOG_ERROR, "Could not parse video size: %s.\n", s->video_size); | |||
| return ret; | |||
| } | |||
| if ((ret = av_parse_video_rate(&framerate, s->framerate)) < 0) { | |||
| av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s->framerate); | |||
| return ret; | |||
| } | |||
| #if FF_API_FORMAT_PARAMETERS | |||
| if (ap->pix_fmt != PIX_FMT_NONE) | |||
| pix_fmt = ap->pix_fmt; | |||
| if (ap->width > 0) | |||
| width = ap->width; | |||
| if (ap->height > 0) | |||
| height = ap->height; | |||
| if (ap->time_base.num) | |||
| framerate = (AVRational){ap->time_base.den, ap->time_base.num}; | |||
| #endif | |||
| av_strlcpy(s->path, s1->filename, sizeof(s->path)); | |||
| s->img_number = 0; | |||
| s->img_count = 0; | |||
| @@ -224,15 +258,11 @@ static int read_header(AVFormatContext *s1, AVFormatParameters *ap) | |||
| st->need_parsing = AVSTREAM_PARSE_FULL; | |||
| } | |||
| if (!ap->time_base.num) { | |||
| av_set_pts_info(st, 60, 1, 25); | |||
| } else { | |||
| av_set_pts_info(st, 60, ap->time_base.num, ap->time_base.den); | |||
| } | |||
| av_set_pts_info(st, 60, framerate.den, framerate.num); | |||
| if(ap->width && ap->height){ | |||
| st->codec->width = ap->width; | |||
| st->codec->height= ap->height; | |||
| if (width && height) { | |||
| st->codec->width = width; | |||
| st->codec->height = height; | |||
| } | |||
| if (!s->is_pipe) { | |||
| @@ -258,8 +288,8 @@ static int read_header(AVFormatContext *s1, AVFormatParameters *ap) | |||
| st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | |||
| st->codec->codec_id = av_str2id(img_tags, s->path); | |||
| } | |||
| if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ap->pix_fmt != PIX_FMT_NONE) | |||
| st->codec->pix_fmt = ap->pix_fmt; | |||
| if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pix_fmt != PIX_FMT_NONE) | |||
| st->codec->pix_fmt = pix_fmt; | |||
| return 0; | |||
| } | |||
| @@ -430,6 +460,22 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) | |||
| #endif /* CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER */ | |||
| #define OFFSET(x) offsetof(VideoData, x) | |||
| #define DEC AV_OPT_FLAG_DECODING_PARAM | |||
| static const AVOption options[] = { | |||
| { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, | |||
| { "video_size", "", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, | |||
| { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, | |||
| { NULL }, | |||
| }; | |||
| static const AVClass img2_class = { | |||
| .class_name = "image2 demuxer", | |||
| .item_name = av_default_item_name, | |||
| .option = options, | |||
| .version = LIBAVUTIL_VERSION_INT, | |||
| }; | |||
| /* input */ | |||
| #if CONFIG_IMAGE2_DEMUXER | |||
| AVInputFormat ff_image2_demuxer = { | |||
| @@ -440,6 +486,7 @@ AVInputFormat ff_image2_demuxer = { | |||
| .read_header = read_header, | |||
| .read_packet = read_packet, | |||
| .flags = AVFMT_NOFILE, | |||
| .priv_class = &img2_class, | |||
| }; | |||
| #endif | |||
| #if CONFIG_IMAGE2PIPE_DEMUXER | |||
| @@ -449,6 +496,7 @@ AVInputFormat ff_image2pipe_demuxer = { | |||
| .priv_data_size = sizeof(VideoData), | |||
| .read_header = read_header, | |||
| .read_packet = read_packet, | |||
| .priv_class = &img2_class, | |||
| }; | |||
| #endif | |||
| @@ -37,6 +37,7 @@ typedef struct { | |||
| int chars_per_frame; | |||
| uint64_t fsize; /**< file size less metadata buffer */ | |||
| char *video_size;/**< A string describing video size, set by a private option. */ | |||
| char *framerate; /**< Set by a private option. */ | |||
| } TtyDemuxContext; | |||
| /** | |||
| @@ -75,6 +76,7 @@ static int read_header(AVFormatContext *avctx, | |||
| TtyDemuxContext *s = avctx->priv_data; | |||
| int width = 0, height = 0, ret = 0; | |||
| AVStream *st = av_new_stream(avctx, 0); | |||
| AVRational framerate; | |||
| if (!st) { | |||
| ret = AVERROR(ENOMEM); | |||
| @@ -88,20 +90,21 @@ static int read_header(AVFormatContext *avctx, | |||
| av_log (avctx, AV_LOG_ERROR, "Couldn't parse video size.\n"); | |||
| goto fail; | |||
| } | |||
| if ((ret = av_parse_video_rate(&framerate, s->framerate)) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s->framerate); | |||
| goto fail; | |||
| } | |||
| #if FF_API_FORMAT_PARAMETERS | |||
| if (ap->width > 0) | |||
| width = ap->width; | |||
| if (ap->height > 0) | |||
| height = ap->height; | |||
| if (ap->time_base.num) | |||
| framerate = (AVRational){ap->time_base.den, ap->time_base.num}; | |||
| #endif | |||
| st->codec->width = width; | |||
| st->codec->height = height; | |||
| if (!ap->time_base.num) { | |||
| av_set_pts_info(st, 60, 1, 25); | |||
| } else { | |||
| av_set_pts_info(st, 60, ap->time_base.num, ap->time_base.den); | |||
| } | |||
| av_set_pts_info(st, 60, framerate.den, framerate.num); | |||
| /* simulate tty display speed */ | |||
| #if FF_API_FORMAT_PARAMETERS | |||
| @@ -152,6 +155,7 @@ static int read_packet(AVFormatContext *avctx, AVPacket *pkt) | |||
| static const AVOption options[] = { | |||
| { "chars_per_frame", "", offsetof(TtyDemuxContext, chars_per_frame), FF_OPT_TYPE_INT, {.dbl = 6000}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM}, | |||
| { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, | |||
| { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, | |||
| { NULL }, | |||
| }; | |||