summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog1
-rw-r--r--avconv.c46
-rw-r--r--doc/avconv.texi3
-rw-r--r--doc/faq.texi144
-rw-r--r--doc/ffserver.texi1
-rw-r--r--doc/general.texi1
-rw-r--r--libavcodec/Makefile1
-rw-r--r--libavcodec/allcodecs.c1
-rw-r--r--libavcodec/avcodec.h1
-rw-r--r--libavcodec/cljr.c2
-rw-r--r--libavcodec/dxtory.c109
-rw-r--r--libavcodec/ptx.c9
-rw-r--r--libavcodec/tta.c5
-rw-r--r--libavformat/avformat.h124
-rw-r--r--libavformat/avio.h4
-rw-r--r--libavformat/flacdec.c27
-rw-r--r--libavformat/flacenc_header.c10
-rw-r--r--libavformat/riff.c1
-rw-r--r--libavformat/version.h6
-rwxr-xr-xtests/codec-regression.sh5
-rw-r--r--tests/fate2.mak24
-rw-r--r--tests/ref/fate/utvideo_rgb_left4
-rw-r--r--tests/ref/fate/utvideo_rgb_median5
-rw-r--r--tests/ref/fate/utvideo_rgba_left5
-rw-r--r--tests/ref/fate/utvideo_rgba_median5
-rw-r--r--tests/ref/fate/utvideo_yuv420_left7
-rw-r--r--tests/ref/fate/utvideo_yuv420_median4
-rw-r--r--tests/ref/fate/utvideo_yuv422_left4
-rw-r--r--tests/ref/fate/utvideo_yuv422_median4
-rw-r--r--tests/ref/vsynth1/cljr4
-rw-r--r--tests/ref/vsynth2/cljr4
31 files changed, 342 insertions, 229 deletions
diff --git a/Changelog b/Changelog
index 228293ff36..2a20c357c4 100644
--- a/Changelog
+++ b/Changelog
@@ -132,6 +132,7 @@ easier to use. The changes are:
- PCM format support in OMA demuxer
- CLJR encoder
- new option: -report
+- Dxtory capture format decoder
version 0.8:
diff --git a/avconv.c b/avconv.c
index d0c9aabaf4..4c99a6fdd7 100644
--- a/avconv.c
+++ b/avconv.c
@@ -3635,41 +3635,6 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
return 0;
}
-static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
-{
- int i, err;
- AVFormatContext *ic = avformat_alloc_context();
-
- ic->interrupt_callback = int_cb;
- err = avformat_open_input(&ic, filename, NULL, NULL);
- if (err < 0)
- return err;
- /* copy stream format */
- for(i=0;i<ic->nb_streams;i++) {
- AVStream *st;
- OutputStream *ost;
- AVCodec *codec;
-
- codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
- ost = new_output_stream(o, s, codec->type);
- st = ost->st;
-
- // FIXME: a more elegant solution is needed
- memcpy(st, ic->streams[i], sizeof(AVStream));
- st->info = av_malloc(sizeof(*st->info));
- memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
- avcodec_copy_context(st->codec, ic->streams[i]->codec);
-
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
- choose_sample_fmt(st, codec);
- else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
- choose_pixel_fmt(st, codec);
- }
-
- av_close_input_file(ic);
- return 0;
-}
-
static void opt_output_file(void *optctx, const char *filename)
{
OptionsContext *o = optctx;
@@ -3691,16 +3656,7 @@ static void opt_output_file(void *optctx, const char *filename)
file_oformat= oc->oformat;
oc->interrupt_callback = int_cb;
- if (!strcmp(file_oformat->name, "ffm") &&
- av_strstart(filename, "http:", NULL)) {
- /* special case for files sent to ffserver: we get the stream
- parameters from ffserver */
- int err = read_ffserver_streams(o, oc, filename);
- if (err < 0) {
- print_error(filename, err);
- exit_program(1);
- }
- } else if (!o->nb_stream_maps) {
+ if (!o->nb_stream_maps) {
/* pick the "best" stream of each type */
#define NEW_STREAM(type, index)\
if (index >= 0) {\
diff --git a/doc/avconv.texi b/doc/avconv.texi
index 854d7a597d..14e02f8f95 100644
--- a/doc/avconv.texi
+++ b/doc/avconv.texi
@@ -259,7 +259,7 @@ Set the number of video frames to record. This is an alias for @code{-frames:v}.
@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream})
Set frame rate (Hz value, fraction or abbreviation), (default = 25).
@item -s[:@var{stream_specifier}] @var{size} (@emph{input/output,per-stream})
-Set frame size. The format is @samp{wxh} (ffserver default = 160x128, avconv default = same as source).
+Set frame size. The format is @samp{wxh} (default - same as source).
The following abbreviations are recognized:
@table @samp
@item sqcif
@@ -1029,6 +1029,7 @@ the input file in reverse order.
@c man begin SEEALSO
ffplay(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation
+
@c man end
@c man begin AUTHORS
diff --git a/doc/faq.texi b/doc/faq.texi
index 88d8b37553..3ad503dc83 100644
--- a/doc/faq.texi
+++ b/doc/faq.texi
@@ -11,22 +11,6 @@
@chapter General Questions
-@section When will the next FFmpeg version be released? / Why are FFmpeg releases so few and far between?
-
-Like most open source projects FFmpeg suffers from a certain lack of
-manpower. For this reason the developers have to prioritize the work
-they do and putting out releases is not at the top of the list, fixing
-bugs and reviewing patches takes precedence. Please don't complain or
-request more timely and/or frequent releases unless you are willing to
-help out creating them.
-
-@section I have a problem with an old version of FFmpeg; where should I report it?
-Nowhere. We do not support old FFmpeg versions in any way, we simply lack
-the time, motivation and manpower to do so. If you have a problem with an
-old version of FFmpeg, upgrade to the latest git snapshot. If you
-still experience the problem, then you can report it according to the
-guidelines in @url{http://ffmpeg.org/bugreports.html}.
-
@section Why doesn't FFmpeg support feature [xyz]?
Because no one has taken on that task yet. FFmpeg development is
@@ -40,30 +24,6 @@ No. Windows DLLs are not portable, bloated and often slow.
Moreover FFmpeg strives to support all codecs natively.
A DLL loader is not conducive to that goal.
-@section My bug report/mail to ffmpeg-devel/user has not received any replies.
-
-Likely reasons
-@itemize
-@item We are busy and haven't had time yet to read your report or
-investigate the issue.
-@item You didn't follow @url{http://ffmpeg.org/bugreports.html}.
-@item You didn't use git master.
-@item You reported a segmentation fault without gdb output.
-@item You describe a problem but not how to reproduce it.
-@item It's unclear if you use ffmpeg as command line tool or use
-libav* from another application.
-@item You speak about a video having problems on playback but
-not what you use to play it.
-@item We have no faint clue what you are talking about besides
-that it is related to FFmpeg.
-@end itemize
-
-@section Is there a forum for FFmpeg? I do not like mailing lists.
-
-You may view our mailing lists with a more forum-alike look here:
-@url{http://dir.gmane.org/gmane.comp.video.ffmpeg.user},
-but, if you post, please remember that our mailing list rules still apply there.
-
@section I cannot read this file although this format seems to be supported by ffmpeg.
Even if ffmpeg can read the container format, it may not support all its
@@ -175,15 +135,15 @@ The @file{movie.mpg} used as input will be converted to
Instead of relying on file format self-recognition, you may also use
@table @option
-@item -vcodec ppm
-@item -vcodec png
-@item -vcodec mjpeg
+@item -c:v ppm
+@item -c:v png
+@item -c:v mjpeg
@end table
to force the encoding.
Applying that to the previous example:
@example
- ffmpeg -i movie.mpg -f image2 -vcodec mjpeg menu%d.jpg
+ ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
@end example
Beware that there is no "jpeg" codec. Use "mjpeg" instead.
@@ -205,56 +165,18 @@ Try '-f image2 test%d.jpg'.
@section Why can I not change the frame rate?
Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates.
-Choose a different codec with the -vcodec command line option.
+Choose a different codec with the -c:v command line option.
@section How do I encode Xvid or DivX video with ffmpeg?
Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4
standard (note that there are many other coding formats that use this
-same standard). Thus, use '-vcodec mpeg4' to encode in these formats. The
+same standard). Thus, use '-c:v mpeg4' to encode in these formats. The
default fourcc stored in an MPEG-4-coded file will be 'FMP4'. If you want
a different fourcc, use the '-vtag' option. E.g., '-vtag xvid' will
force the fourcc 'xvid' to be stored as the video fourcc rather than the
default.
-@section How do I encode videos which play on the iPod?
-
-@table @option
-@item needed stuff
--acodec libfaac -vcodec mpeg4 width<=320 height<=240
-@item working stuff
-mv4, title
-@item non-working stuff
-B-frames
-@item example command line
-ffmpeg -i input -acodec libfaac -ab 128k -vcodec mpeg4 -b 1200k -mbd 2 -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -s 320x180 -metadata title=X output.mp4
-@end table
-
-@section How do I encode videos which play on the PSP?
-
-@table @option
-@item needed stuff
--acodec libfaac -vcodec mpeg4 width*height<=76800 width%16=0 height%16=0 -ar 24000 -r 30000/1001 or 15000/1001 -f psp
-@item working stuff
-mv4, title
-@item non-working stuff
-B-frames
-@item example command line
-ffmpeg -i input -acodec libfaac -ab 128k -vcodec mpeg4 -b 1200k -ar 24000 -mbd 2 -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -s 368x192 -r 30000/1001 -metadata title=X -f psp output.mp4
-@item needed stuff for H.264
--acodec libfaac -vcodec libx264 width*height<=76800 width%16=0? height%16=0? -ar 48000 -coder 1 -r 30000/1001 or 15000/1001 -f psp
-@item working stuff for H.264
-title, loop filter
-@item non-working stuff for H.264
-CAVLC
-@item example command line
-ffmpeg -i input -acodec libfaac -ab 128k -vcodec libx264 -b 1200k -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -s 368x192 -r 30000/1001 -metadata title=X -f psp -flags loop -trellis 2 -partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 output.mp4
-@item higher resolution for newer PSP firmwares, width<=480, height<=272
--vcodec libx264 -level 21 -coder 1 -f psp
-@item example command line
-ffmpeg -i input -acodec libfaac -ab 128k -ac 2 -ar 48000 -vcodec libx264 -level 21 -b 640k -coder 1 -f psp -flags +loop -trellis 2 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -g 250 -s 480x272 output.mp4
-@end table
-
@section Which are good parameters for encoding high quality MPEG-4?
'-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2',
@@ -300,13 +222,13 @@ equally humble @code{copy} under Windows), and finally transcoding back to your
format of choice.
@example
-ffmpeg -i input1.avi -sameq intermediate1.mpg
-ffmpeg -i input2.avi -sameq intermediate2.mpg
+ffmpeg -i input1.avi -same_quant intermediate1.mpg
+ffmpeg -i input2.avi -same_quant intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
-ffmpeg -i intermediate_all.mpg -sameq output.avi
+ffmpeg -i intermediate_all.mpg -same_quant output.avi
@end example
-Notice that you should either use @code{-sameq} or set a reasonably high
+Notice that you should either use @code{-same_quant} or set a reasonably high
bitrate for your intermediate and output files, if you want to preserve
video quality.
@@ -316,10 +238,10 @@ of named pipes, should your platform support it:
@example
mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
-ffmpeg -i input1.avi -sameq -y intermediate1.mpg < /dev/null &
-ffmpeg -i input2.avi -sameq -y intermediate2.mpg < /dev/null &
+ffmpeg -i input1.avi -same_quant -y intermediate1.mpg < /dev/null &
+ffmpeg -i input2.avi -same_quant -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
-ffmpeg -f mpeg -i - -sameq -vcodec mpeg4 -acodec libmp3lame output.avi
+ffmpeg -f mpeg -i - -same_quant -c:v mpeg4 -acodec libmp3lame output.avi
@end example
Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
@@ -346,28 +268,10 @@ cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \
-f yuv4mpegpipe -i all.v \
- -sameq -y output.flv
+ -same_quant -y output.flv
rm temp[12].[av] all.[av]
@end example
-@section The ffmpeg program does not respect the -maxrate setting, some frames are bigger than maxrate/fps.
-
-Read the MPEG spec about video buffer verifier.
-
-@section I want CBR, but no matter what I do frame sizes differ.
-
-You do not understand what CBR is, please read the MPEG spec.
-Read about video buffer verifier and constant bitrate.
-The one sentence summary is that there is a buffer and the input rate is
-constant, the output can vary as needed.
-
-@section How do I check if a stream is CBR?
-
-To quote the MPEG-2 spec:
-"There is no way to tell that a bitstream is constant bitrate without
-examining all of the vbv_delay values and making complicated computations."
-
-
@chapter Development
@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
@@ -414,7 +318,7 @@ the FFmpeg Windows Help Forum at
No. These tools are too bloated and they complicate the build.
-@section Why not rewrite ffmpeg in object-oriented C++?
+@section Why not rewrite FFmpeg in object-oriented C++?
FFmpeg is already organized in a highly modular manner and does not need to
be rewritten in a formal object language. Further, many of the developers
@@ -433,15 +337,7 @@ Yes, as long as the code is optional and can easily and cleanly be placed
under #if CONFIG_GPL without breaking anything. So, for example, a new codec
or filter would be OK under GPL while a bug fix to LGPL code would not.
-@section I want to compile xyz.c alone but my compiler produced many errors.
-
-Common code is in its own files in libav* and is used by the individual
-codecs. They will not work without the common parts, you have to compile
-the whole libav*. If you wish, disable some parts with configure switches.
-You can also try to hack it and remove more, but if you had problems fixing
-the compilation failure then you are probably not qualified for this.
-
-@section I'm using libavcodec from within my C++ application but the linker complains about missing symbols which seem to be available.
+@section I'm using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.
FFmpeg is a pure C project, so to use the libraries within your C++ application
you need to explicitly state that you are using a C library. You can do this by
@@ -459,14 +355,6 @@ to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
You have to implement a URLProtocol, see @file{libavformat/file.c} in
FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
-@section I get "No compatible shell script interpreter found." in MSys.
-
-The standard MSys bash (2.04) is broken. You need to install 2.05 or later.
-
-@section I get "./configure: line <xxx>: pr: command not found" in MSys.
-
-The standard MSys install doesn't come with pr. You need to get it from the coreutils package.
-
@section Where can I find libav* headers for Pascal/Delphi?
see @url{http://www.iversenit.dk/dev/ffmpeg-headers/}
diff --git a/doc/ffserver.texi b/doc/ffserver.texi
index 3ff275d8e2..1b9a494f49 100644
--- a/doc/ffserver.texi
+++ b/doc/ffserver.texi
@@ -23,6 +23,7 @@ ffserver [options]
@c man begin DESCRIPTION
ffserver is a streaming server for both audio and video. It supports
+
several live feeds, streaming from files and time shifting on live feeds
(you can seek to positions in the past on each live feed, provided you
specify a big enough feed storage in ffserver.conf).
diff --git a/doc/general.texi b/doc/general.texi
index c77cb78eb9..fc4ee1cf3a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -471,6 +471,7 @@ following image formats are supported:
@item Duck TrueMotion 2.0 @tab @tab X
@tab fourcc: TM20
@item DV (Digital Video) @tab X @tab X
+@item Dxtory capture format @tab @tab X
@item Feeble Files/ScummVM DXA @tab @tab X
@tab Codec originally used in Feeble Files game.
@item Electronic Arts CMV video @tab @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 04f29e59b3..6410ed47f3 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -133,6 +133,7 @@ OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o
OBJS-$(CONFIG_DVVIDEO_DECODER) += dv.o dvdata.o
OBJS-$(CONFIG_DVVIDEO_ENCODER) += dv.o dvdata.o
OBJS-$(CONFIG_DXA_DECODER) += dxa.o
+OBJS-$(CONFIG_DXTORY_DECODER) += dxtory.o
OBJS-$(CONFIG_EAC3_DECODER) += eac3dec.o eac3_data.o
OBJS-$(CONFIG_EAC3_ENCODER) += eac3enc.o ac3enc.o ac3enc_float.o \
ac3tab.o ac3.o kbdwin.o eac3_data.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 19afbd4895..9e130477dd 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -99,6 +99,7 @@ void avcodec_register_all(void)
REGISTER_DECODER (DSICINVIDEO, dsicinvideo);
REGISTER_ENCDEC (DVVIDEO, dvvideo);
REGISTER_DECODER (DXA, dxa);
+ REGISTER_DECODER (DXTORY, dxtory);
REGISTER_DECODER (EACMV, eacmv);
REGISTER_DECODER (EAMAD, eamad);
REGISTER_DECODER (EATGQ, eatgq);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 26502b9f7f..23048ddb72 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -253,6 +253,7 @@ enum CodecID {
CODEC_ID_UTVIDEO_DEPRECATED,
CODEC_ID_BMV_VIDEO,
CODEC_ID_VBLE,
+ CODEC_ID_DXTORY,
CODEC_ID_UTVIDEO = 0x800,
CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'),
diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c
index ed0eede5bf..7ae3e7eeeb 100644
--- a/libavcodec/cljr.c
+++ b/libavcodec/cljr.c
@@ -31,7 +31,6 @@
typedef struct CLJRContext {
AVClass *avclass;
- AVCodecContext *avctx;
AVFrame picture;
int dither_type;
} CLJRContext;
@@ -42,7 +41,6 @@ static av_cold int common_init(AVCodecContext *avctx)
avcodec_get_frame_defaults(&a->picture);
avctx->coded_frame = &a->picture;
- a->avctx = avctx;
return 0;
}
diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c
new file mode 100644
index 0000000000..5f67fbdbef
--- /dev/null
+++ b/libavcodec/dxtory.c
@@ -0,0 +1,109 @@
+/*
+ * Dxtory decoder
+ *
+ * Copyright (c) 2011 Konstantin Shishkov
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "libavutil/intreadwrite.h"
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+ avctx->pix_fmt = PIX_FMT_YUV420P;
+ avctx->coded_frame = avcodec_alloc_frame();
+ if (!avctx->coded_frame)
+ return AVERROR(ENOMEM);
+
+ return 0;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
+ AVPacket *avpkt)
+{
+ int h, w;
+ AVFrame *pic = avctx->coded_frame;
+ const uint8_t *src = avpkt->data;
+ uint8_t *Y1, *Y2, *U, *V;
+ int ret;
+
+ if (pic->data[0])
+ avctx->release_buffer(avctx, pic);
+
+ if (avpkt->size < avctx->width * avctx->height * 3 / 2 + 16) {
+ av_log(avctx, AV_LOG_ERROR, "packet too small\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ pic->reference = 0;
+ if ((ret = avctx->get_buffer(avctx, pic)) < 0)
+ return ret;
+
+ pic->pict_type = AV_PICTURE_TYPE_I;
+ pic->key_frame = 1;
+
+ if (AV_RL32(src) != 0x01000002) {
+ av_log_ask_for_sample(avctx, "Unknown frame header %X\n", AV_RL32(src));
+ return AVERROR_PATCHWELCOME;
+ }
+ src += 16;
+
+ Y1 = pic->data[0];
+ Y2 = pic->data[0] + pic->linesize[0];
+ U = pic->data[1];
+ V = pic->data[2];
+ for (h = 0; h < avctx->height; h += 2) {
+ for (w = 0; w < avctx->width; w += 2) {
+ AV_WN16A(Y1 + w, AV_RN16A(src));
+ AV_WN16A(Y2 + w, AV_RN16A(src + 2));
+ U[w >> 1] = src[4] + 0x80;
+ V[w >> 1] = src[5] + 0x80;
+ src += 6;
+ }
+ Y1 += pic->linesize[0] << 1;
+ Y2 += pic->linesize[0] << 1;
+ U += pic->linesize[1];
+ V += pic->linesize[2];
+ }
+
+ *data_size = sizeof(AVFrame);
+ *(AVFrame*)data = *pic;
+
+ return avpkt->size;
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+ AVFrame *pic = avctx->coded_frame;
+ if (pic->data[0])
+ avctx->release_buffer(avctx, pic);
+ av_freep(&avctx->coded_frame);
+
+ return 0;
+}
+
+AVCodec ff_dxtory_decoder = {
+ .name = "dxtory",
+ .long_name = NULL_IF_CONFIG_SMALL("Dxtory"),
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = CODEC_ID_DXTORY,
+ .init = decode_init,
+ .close = decode_close,
+ .decode = decode_frame,
+ .capabilities = CODEC_CAP_DR1,
+};
diff --git a/libavcodec/ptx.c b/libavcodec/ptx.c
index fb457f234a..f3bca86db2 100644
--- a/libavcodec/ptx.c
+++ b/libavcodec/ptx.c
@@ -84,9 +84,7 @@ static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
ptr = p->data[0];
stride = p->linesize[0];
- for (y=0; y<h; y++) {
- if (buf_end - buf < w * bytes_per_pixel)
- break;
+ for (y = 0; y < h && buf_end - buf >= w * bytes_per_pixel; y++) {
#if HAVE_BIGENDIAN
unsigned int x;
for (x=0; x<w*bytes_per_pixel; x+=bytes_per_pixel)
@@ -101,6 +99,11 @@ static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
*picture = s->picture;
*data_size = sizeof(AVPicture);
+ if (y < h) {
+ av_log(avctx, AV_LOG_WARNING, "incomplete packet\n");
+ return avpkt->size;
+ }
+
return offset + w*h*bytes_per_pixel;
}
diff --git a/libavcodec/tta.c b/libavcodec/tta.c
index 3c4c152213..2c3539e44f 100644
--- a/libavcodec/tta.c
+++ b/libavcodec/tta.c
@@ -233,6 +233,11 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
s->data_length = get_bits_long(&s->gb, 32);
skip_bits(&s->gb, 32); // CRC32 of header
+ if (s->channels == 0) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid number of channels\n");
+ return AVERROR_INVALIDDATA;
+ }
+
switch(s->bps) {
case 1: avctx->sample_fmt = AV_SAMPLE_FMT_U8; break;
case 2:
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 64252029d3..1f3506d158 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -22,6 +22,12 @@
#define AVFORMAT_AVFORMAT_H
/**
+ * @file
+ * @ingroup libavf
+ * Main libavformat public API header
+ */
+
+/**
* @defgroup libavf I/O and Muxing/Demuxing Library
* @{
*
@@ -33,7 +39,7 @@
* @{
* @}
*
- * @defgroup lavf_proto I/O Read/Write
+ * @defgroup lavf_io I/O Read/Write
* @{
* @}
*
@@ -86,10 +92,17 @@ struct AVFormatContext;
/**
* @defgroup metadata_api Public Metadata API
* @{
+ * @ingroup libavf
* The metadata API allows libavformat to export metadata tags to a client
- * application using a sequence of key/value pairs. Like all strings in FFmpeg,
- * metadata must be stored as UTF-8 encoded Unicode. Note that metadata
+ * application when demuxing. Conversely it allows a client application to
+ * set metadata when muxing.
+ *
+ * Metadata is exported or set as pairs of key/value strings in the 'metadata'
+ * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs
+ * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg,
+ * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata
* exported by demuxers isn't checked to be valid UTF-8 in most cases.
+ *
* Important concepts to keep in mind:
* - Keys are unique; there can never be 2 tags with the same key. This is
* also meant semantically, i.e., a demuxer should not knowingly produce
@@ -313,6 +326,10 @@ typedef struct AVFormatParameters {
increasing timestamps, but they must
still be monotonic */
+/**
+ * @addtogroup lavf_encoding
+ * @{
+ */
typedef struct AVOutputFormat {
const char *name;
/**
@@ -373,7 +390,14 @@ typedef struct AVOutputFormat {
/* private fields */
struct AVOutputFormat *next;
} AVOutputFormat;
+/**
+ * @}
+ */
+/**
+ * @addtogroup lavf_decoding
+ * @{
+ */
typedef struct AVInputFormat {
/**
* A comma separated list of short names for the format. New names
@@ -495,6 +519,9 @@ typedef struct AVInputFormat {
/* private fields */
struct AVInputFormat *next;
} AVInputFormat;
+/**
+ * @}
+ */
enum AVStreamParseType {
AVSTREAM_PARSE_NONE,
@@ -1281,7 +1308,46 @@ enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int
*/
unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id);
-/* media file input */
+/**
+ * Allocate an AVFormatContext.
+ * avformat_free_context() can be used to free the context and everything
+ * allocated by the framework within it.
+ */
+AVFormatContext *avformat_alloc_context(void);
+
+#if FF_API_ALLOC_OUTPUT_CONTEXT
+/**
+ * @deprecated deprecated in favor of avformat_alloc_output_context2()
+ */
+attribute_deprecated
+AVFormatContext *avformat_alloc_output_context(const char *format,
+ AVOutputFormat *oformat,
+ const char *filename);
+#endif
+
+/**
+ * Allocate an AVFormatContext for an output format.
+ * avformat_free_context() can be used to free the context and
+ * everything allocated by the framework within it.
+ *
+ * @param *ctx is set to the created format context, or to NULL in
+ * case of failure
+ * @param oformat format to use for allocating the context, if NULL
+ * format_name and filename are used instead
+ * @param format_name the name of output format to use for allocating the
+ * context, if NULL filename is used instead
+ * @param filename the name of the filename to use for allocating the
+ * context, may be NULL
+ * @return >= 0 in case of success, a negative AVERROR code in case of
+ * failure
+ */
+int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
+ const char *format_name, const char *filename);
+
+/**
+ * @addtogroup lavf_decoding
+ * @{
+ */
/**
* Find AVInputFormat based on the short name of the input format.
@@ -1390,42 +1456,6 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputForma
int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap);
-/**
- * Allocate an AVFormatContext.
- * avformat_free_context() can be used to free the context and everything
- * allocated by the framework within it.
- */
-AVFormatContext *avformat_alloc_context(void);
-
-#if FF_API_ALLOC_OUTPUT_CONTEXT
-/**
- * @deprecated deprecated in favor of avformat_alloc_output_context2()
- */
-attribute_deprecated
-AVFormatContext *avformat_alloc_output_context(const char *format,
- AVOutputFormat *oformat,
- const char *filename);
-#endif
-
-/**
- * Allocate an AVFormatContext for an output format.
- * avformat_free_context() can be used to free the context and
- * everything allocated by the framework within it.
- *
- * @param *ctx is set to the created format context, or to NULL in
- * case of failure
- * @param oformat format to use for allocating the context, if NULL
- * format_name and filename are used instead
- * @param format_name the name of output format to use for allocating the
- * context, if NULL filename is used instead
- * @param filename the name of the filename to use for allocating the
- * context, may be NULL
- * @return >= 0 in case of success, a negative AVERROR code in case of
- * failure
- */
-int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
- const char *format_name, const char *filename);
-
#if FF_API_FORMAT_PARAMETERS
/**
* Read packets of a media file to get stream information. This
@@ -1617,6 +1647,9 @@ void av_close_input_stream(AVFormatContext *s);
* @param s media file handle
*/
void av_close_input_file(AVFormatContext *s);
+/**
+ * @}
+ */
/**
* Free an AVFormatContext and all its streams.
@@ -1708,9 +1741,6 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index,
int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ));
#endif
-/**
- * media file output
- */
#if FF_API_FORMAT_PARAMETERS
/**
* @deprecated pass the options to avformat_write_header directly.
@@ -1743,7 +1773,10 @@ void av_url_split(char *proto, int proto_size,
int *port_ptr,
char *path, int path_size,
const char *url);
-
+/**
+ * @addtogroup lavf_encoding
+ * @{
+ */
/**
* Allocate the stream private data and write the stream header to
* an output media file.
@@ -1835,6 +1868,9 @@ int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
* @return 0 if OK, AVERROR_xxx on error
*/
int av_write_trailer(AVFormatContext *s);
+/**
+ * @}
+ */
/**
* Get timing information for the data currently output.
diff --git a/libavformat/avio.h b/libavformat/avio.h
index 88fe1577ff..7cf14f9f8c 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -22,6 +22,7 @@
/**
* @file
+ * @ingroup lavf_io
* Buffered I/O operations
*/
@@ -211,6 +212,7 @@ extern URLInterruptCB *url_interrupt_cb;
* @defgroup old_url_funcs Old url_* functions
* The following functions are deprecated. Use the buffered API based on #AVIOContext instead.
* @{
+ * @ingroup lavf_io
*/
attribute_deprecated int url_open_protocol (URLContext **puc, struct URLProtocol *up,
const char *url, int flags);
@@ -271,6 +273,7 @@ attribute_deprecated AVIOContext *av_alloc_put_byte(
* @defgroup old_avio_funcs Old put_/get_*() functions
* The following functions are deprecated. Use the "avio_"-prefixed functions instead.
* @{
+ * @ingroup lavf_io
*/
attribute_deprecated int get_buffer(AVIOContext *s, unsigned char *buf, int size);
attribute_deprecated int get_partial_buffer(AVIOContext *s, unsigned char *buf, int size);
@@ -308,6 +311,7 @@ attribute_deprecated int64_t av_url_read_fseek (AVIOContext *h, int stream_in
* @defgroup old_url_f_funcs Old url_f* functions
* The following functions are deprecated, use the "avio_"-prefixed functions instead.
* @{
+ * @ingroup lavf_io
*/
attribute_deprecated int url_fopen( AVIOContext **s, const char *url, int flags);
attribute_deprecated int url_fclose(AVIOContext *s);
diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index 8f855bb02d..163d2fac61 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -25,6 +25,7 @@
#include "rawdec.h"
#include "oggdec.h"
#include "vorbiscomment.h"
+#include "libavcodec/bytestream.h"
static int flac_read_header(AVFormatContext *s,
AVFormatParameters *ap)
@@ -54,6 +55,7 @@ static int flac_read_header(AVFormatContext *s,
switch (metadata_type) {
/* allocate and read metadata block for supported types */
case FLAC_METADATA_TYPE_STREAMINFO:
+ case FLAC_METADATA_TYPE_CUESHEET:
case FLAC_METADATA_TYPE_VORBIS_COMMENT:
buffer = av_mallocz(metadata_size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!buffer) {
@@ -96,6 +98,31 @@ static int flac_read_header(AVFormatContext *s,
if (si.samples > 0)
st->duration = si.samples;
}
+ } else if (metadata_type == FLAC_METADATA_TYPE_CUESHEET) {
+ uint8_t isrc[13];
+ uint64_t start;
+ const uint8_t *offset;
+ int i, j, chapters, track, ti;
+ if (metadata_size < 431)
+ return AVERROR_INVALIDDATA;
+ offset = buffer + 395;
+ chapters = bytestream_get_byte(&offset) - 1;
+ if (chapters <= 0)
+ return AVERROR_INVALIDDATA;
+ for (i = 0; i < chapters; i++) {
+ if (offset + 36 - buffer > metadata_size)
+ return AVERROR_INVALIDDATA;
+ start = bytestream_get_be64(&offset);
+ track = bytestream_get_byte(&offset);
+ bytestream_get_buffer(&offset, isrc, 12);
+ isrc[12] = 0;
+ offset += 14;
+ ti = bytestream_get_byte(&offset);
+ if (ti <= 0) return AVERROR_INVALIDDATA;
+ for (j = 0; j < ti; j++)
+ offset += 12;
+ avpriv_new_chapter(s, track, st->time_base, start, AV_NOPTS_VALUE, isrc);
+ }
} else {
/* STREAMINFO must be the first block */
if (!found_streaminfo) {
diff --git a/libavformat/flacenc_header.c b/libavformat/flacenc_header.c
index cfbdc890af..e16c14bf53 100644
--- a/libavformat/flacenc_header.c
+++ b/libavformat/flacenc_header.c
@@ -37,13 +37,11 @@ int ff_flac_write_header(AVIOContext *pb, AVCodecContext *codec,
if (!avpriv_flac_is_extradata_valid(codec, &format, &streaminfo))
return -1;
- /* write "fLaC" stream marker and first metadata block header if needed */
- if (format == FLAC_EXTRADATA_FORMAT_STREAMINFO) {
- avio_write(pb, header, 8);
- }
+ /* write "fLaC" stream marker and first metadata block header */
+ avio_write(pb, header, 8);
- /* write STREAMINFO or full header */
- avio_write(pb, codec->extradata, codec->extradata_size);
+ /* write STREAMINFO */
+ avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE);
return 0;
}
diff --git a/libavformat/riff.c b/libavformat/riff.c
index 964085031c..3cc3c354c0 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -287,6 +287,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
{ CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
{ CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
{ CODEC_ID_ESCAPE130, MKTAG('E', '1', '3', '0') },
+ { CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
{ CODEC_ID_NONE, 0 }
};
diff --git a/libavformat/version.h b/libavformat/version.h
index 844cd64464..0fb0b18197 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -21,6 +21,12 @@
#ifndef AVFORMAT_VERSION_H
#define AVFORMAT_VERSION_H
+/**
+ * @file
+ * @ingroup libavf
+ * Libavformat version macros
+ */
+
#include "libavutil/avutil.h"
#define LIBAVFORMAT_VERSION_MAJOR 53
diff --git a/tests/codec-regression.sh b/tests/codec-regression.sh
index f5c57ecccf..7676074d1f 100755
--- a/tests/codec-regression.sh
+++ b/tests/codec-regression.sh
@@ -19,6 +19,11 @@ if [ -n "$do_aref" ]; then
do_avconv $pcm_ref -b 128k -ac 2 -ar 44100 -f s16le -i $pcm_src -f wav
fi
+if [ -n "$do_cljr" ] ; then
+do_video_encoding cljr.avi "-an -vcodec cljr"
+do_video_decoding
+fi
+
if [ -n "$do_mpeg" ] ; then
# mpeg1
do_video_encoding mpeg1.mpg "-qscale 10 -f mpeg1video"
diff --git a/tests/fate2.mak b/tests/fate2.mak
index 1db9c5e298..969fd95961 100644
--- a/tests/fate2.mak
+++ b/tests/fate2.mak
@@ -241,3 +241,27 @@ fate-iirfilter: CMD = run libavcodec/iirfilter-test
FATE_TESTS += fate-vble
fate-vble: CMD = framecrc -i $(SAMPLES)/vble/flowers-partial-2MB.avi
+
+FATE_TESTS += fate-utvideo_rgba_left
+fate-utvideo_rgba_left: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_rgba_left.avi
+
+FATE_TESTS += fate-utvideo_rgba_median
+fate-utvideo_rgba_median: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_rgba_median.avi
+
+FATE_TESTS += fate-utvideo_rgb_left
+fate-utvideo_rgb_left: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_rgb_left.avi
+
+FATE_TESTS += fate-utvideo_rgb_median
+fate-utvideo_rgb_median: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_rgb_median.avi
+
+FATE_TESTS += fate-utvideo_yuv420_left
+fate-utvideo_yuv420_left: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv420_left.avi
+
+FATE_TESTS += fate-utvideo_yuv420_median
+fate-utvideo_yuv420_median: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv420_median.avi
+
+FATE_TESTS += fate-utvideo_yuv422_left
+fate-utvideo_yuv422_left: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv422_left.avi
+
+FATE_TESTS += fate-utvideo_yuv422_median
+fate-utvideo_yuv422_median: CMD = framecrc -i $(SAMPLES)/utvideo/utvideo_yuv422_median.avi
diff --git a/tests/ref/fate/utvideo_rgb_left b/tests/ref/fate/utvideo_rgb_left
new file mode 100644
index 0000000000..5d2b73ca8a
--- /dev/null
+++ b/tests/ref/fate/utvideo_rgb_left
@@ -0,0 +1,4 @@
+0, 0, 921600, 0x27e6001e
+0, 3003, 921600, 0x7c0a92bc
+0, 6006, 921600, 0x4d2be42c
+0, 9009, 921600, 0x58ddd0be
diff --git a/tests/ref/fate/utvideo_rgb_median b/tests/ref/fate/utvideo_rgb_median
new file mode 100644
index 0000000000..69141537b9
--- /dev/null
+++ b/tests/ref/fate/utvideo_rgb_median
@@ -0,0 +1,5 @@
+0, 0, 921600, 0x9776611f
+0, 3003, 921600, 0xdbfa64f4
+0, 6006, 921600, 0xed2a0580
+0, 9009, 921600, 0x6ecc80bc
+0, 12012, 921600, 0x58ddd0be
diff --git a/tests/ref/fate/utvideo_rgba_left b/tests/ref/fate/utvideo_rgba_left
new file mode 100644
index 0000000000..7d3800e970
--- /dev/null
+++ b/tests/ref/fate/utvideo_rgba_left
@@ -0,0 +1,5 @@
+0, 0, 1228800, 0xf1bc9432
+0, 3003, 1228800, 0x8480d1e5
+0, 6006, 1228800, 0xb01d5fb2
+0, 9009, 1228800, 0x53cb42c4
+0, 12012, 1228800, 0x2b2ea176
diff --git a/tests/ref/fate/utvideo_rgba_median b/tests/ref/fate/utvideo_rgba_median
new file mode 100644
index 0000000000..7d3800e970
--- /dev/null
+++ b/tests/ref/fate/utvideo_rgba_median
@@ -0,0 +1,5 @@
+0, 0, 1228800, 0xf1bc9432
+0, 3003, 1228800, 0x8480d1e5
+0, 6006, 1228800, 0xb01d5fb2
+0, 9009, 1228800, 0x53cb42c4
+0, 12012, 1228800, 0x2b2ea176
diff --git a/tests/ref/fate/utvideo_yuv420_left b/tests/ref/fate/utvideo_yuv420_left
new file mode 100644
index 0000000000..bdb90a6168
--- /dev/null
+++ b/tests/ref/fate/utvideo_yuv420_left
@@ -0,0 +1,7 @@
+0, 0, 460800, 0xece98fc8
+0, 3003, 460800, 0x9baf786b
+0, 6006, 460800, 0x8e8e0510
+0, 9009, 460800, 0x27c1f2ba
+0, 12012, 460800, 0x6a817987
+0, 15015, 460800, 0x2f713ec2
+0, 18018, 460800, 0x003b560e
diff --git a/tests/ref/fate/utvideo_yuv420_median b/tests/ref/fate/utvideo_yuv420_median
new file mode 100644
index 0000000000..5cd3bc84ee
--- /dev/null
+++ b/tests/ref/fate/utvideo_yuv420_median
@@ -0,0 +1,4 @@
+0, 0, 460800, 0x6a817987
+0, 3003, 460800, 0x2f713ec2
+0, 6006, 460800, 0x003b560e
+0, 9009, 460800, 0x9e1bbf63
diff --git a/tests/ref/fate/utvideo_yuv422_left b/tests/ref/fate/utvideo_yuv422_left
new file mode 100644
index 0000000000..d68bf4e26e
--- /dev/null
+++ b/tests/ref/fate/utvideo_yuv422_left
@@ -0,0 +1,4 @@
+0, 0, 614400, 0x9a6b8802
+0, 3003, 614400, 0xaa8687e2
+0, 6006, 614400, 0x2fe5bd40
+0, 9009, 614400, 0x1c8f3737
diff --git a/tests/ref/fate/utvideo_yuv422_median b/tests/ref/fate/utvideo_yuv422_median
new file mode 100644
index 0000000000..d68bf4e26e
--- /dev/null
+++ b/tests/ref/fate/utvideo_yuv422_median
@@ -0,0 +1,4 @@
+0, 0, 614400, 0x9a6b8802
+0, 3003, 614400, 0xaa8687e2
+0, 6006, 614400, 0x2fe5bd40
+0, 9009, 614400, 0x1c8f3737
diff --git a/tests/ref/vsynth1/cljr b/tests/ref/vsynth1/cljr
new file mode 100644
index 0000000000..9a7a980b41
--- /dev/null
+++ b/tests/ref/vsynth1/cljr
@@ -0,0 +1,4 @@
+ff4eebcd5bd7b6470f97867cdecb0bec *./tests/data/vsynth1/cljr.avi
+ 5075660 ./tests/data/vsynth1/cljr.avi
+0d473eb49653a05685178dd261de861c *./tests/data/cljr.vsynth1.out.yuv
+stddev: 30.70 PSNR: 18.39 MAXDIFF: 255 bytes: 7603200/ 7603200
diff --git a/tests/ref/vsynth2/cljr b/tests/ref/vsynth2/cljr
new file mode 100644
index 0000000000..cf3c8e1abf
--- /dev/null
+++ b/tests/ref/vsynth2/cljr
@@ -0,0 +1,4 @@
+8ca3f24da468f32561100d3a1a71348d *./tests/data/vsynth2/cljr.avi
+ 5075660 ./tests/data/vsynth2/cljr.avi
+a0126ba9f2b2192b6b63b485e0118114 *./tests/data/cljr.vsynth2.out.yuv
+stddev: 10.26 PSNR: 27.90 MAXDIFF: 62 bytes: 7603200/ 7603200