Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 10 Dec 2011 23:40:09 +0000 (00:40 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 11 Dec 2011 00:05:33 +0000 (01:05 +0100)
* qatar/master: (21 commits)
  Warn about avserver being broken.
  avconv: drop code for special handling of avserver streams.
  rawdec: don't set codec timebase.
  lavf doxy: add muxing stuff to lavf_encoding group
  lavf doxy: add demuxing stuff to lavf_decoding group
  lavf doxy: expand/reword metadata API doxy.
  lavf doxy: add installed headers to groups.
  lavf doxy: add avio groups into the lavf_io group.
  lavf doxy: rename lavf I/O group to lavf_io.
  lavf doxy: add metadata docs to the main lavf group
  ttadec: check channel count as read from extradata.
  Add CLJR encoding and decoding regression tests
  cljr: remove unused code
  flacdec: Support for tracks in cuesheet metadata block
  ptx: fix inverted check for sufficient data
  flac muxer: fix writing of file header and STREAMINFO header from extradata
  ptx: emit a warning on insufficient picture data
  utvideo: add fate tests covering all codec variants
  doc: update to refer to avconv
  doc: remove some stale entries from the faq
  ...

Conflicts:
Changelog
avconv.c
doc/avconv.texi
doc/faq.texi
doc/ffplay.texi
doc/ffprobe.texi
doc/ffserver.texi
libavcodec/avcodec.h
libavcodec/cljr.c
libavformat/avformat.h
libavformat/riff.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
31 files changed:
Changelog
avconv.c
doc/avconv.texi
doc/faq.texi
doc/ffserver.texi
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/cljr.c
libavcodec/dxtory.c [new file with mode: 0644]
libavcodec/ptx.c
libavcodec/tta.c
libavformat/avformat.h
libavformat/avio.h
libavformat/flacdec.c
libavformat/flacenc_header.c
libavformat/riff.c
libavformat/version.h
tests/codec-regression.sh
tests/fate2.mak
tests/ref/fate/utvideo_rgb_left [new file with mode: 0644]
tests/ref/fate/utvideo_rgb_median [new file with mode: 0644]
tests/ref/fate/utvideo_rgba_left [new file with mode: 0644]
tests/ref/fate/utvideo_rgba_median [new file with mode: 0644]
tests/ref/fate/utvideo_yuv420_left [new file with mode: 0644]
tests/ref/fate/utvideo_yuv420_median [new file with mode: 0644]
tests/ref/fate/utvideo_yuv422_left [new file with mode: 0644]
tests/ref/fate/utvideo_yuv422_median [new file with mode: 0644]
tests/ref/vsynth1/cljr [new file with mode: 0644]
tests/ref/vsynth2/cljr [new file with mode: 0644]

index 228293f..2a20c35 100644 (file)
--- 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:
index d0c9aab..4c99a6f 100644 (file)
--- 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) {\
index 854d7a5..14e02f8 100644 (file)
@@ -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
index 88d8b37..3ad503d 100644 (file)
 
 @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/}
index 3ff275d..1b9a494 100644 (file)
@@ -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).
index c77cb78..fc4ee1c 100644 (file)
@@ -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
index 04f29e5..6410ed4 100644 (file)
@@ -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
index 19afbd4..9e13047 100644 (file)
@@ -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);
index 26502b9..23048dd 100644 (file)
@@ -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'),
 
index ed0eede..7ae3e7e 100644 (file)
@@ -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 (file)
index 0000000..5f67fbd
--- /dev/null
@@ -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,
+};
index fb457f2..f3bca86 100644 (file)
@@ -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;
 }
 
index 3c4c152..2c3539e 100644 (file)
@@ -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:
index 6425202..1f3506d 100644 (file)
 #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.
index 88fe157..7cf14f9 100644 (file)
@@ -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);
index 8f855bb..163d2fa 100644 (file)
@@ -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) {
index cfbdc89..e16c14b 100644 (file)
@@ -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;
 }
index 9640850..3cc3c35 100644 (file)
@@ -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 }
 };
 
index 844cd64..0fb0b18 100644 (file)
 #ifndef AVFORMAT_VERSION_H
 #define AVFORMAT_VERSION_H
 
+/**
+ * @file
+ * @ingroup libavf
+ * Libavformat version macros
+ */
+
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 53
index f5c57ec..7676074 100755 (executable)
@@ -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"
index 1db9c5e..969fd95 100644 (file)
@@ -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 (file)
index 0000000..5d2b73c
--- /dev/null
@@ -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 (file)
index 0000000..6914153
--- /dev/null
@@ -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 (file)
index 0000000..7d3800e
--- /dev/null
@@ -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 (file)
index 0000000..7d3800e
--- /dev/null
@@ -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 (file)
index 0000000..bdb90a6
--- /dev/null
@@ -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 (file)
index 0000000..5cd3bc8
--- /dev/null
@@ -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 (file)
index 0000000..d68bf4e
--- /dev/null
@@ -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 (file)
index 0000000..d68bf4e
--- /dev/null
@@ -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 (file)
index 0000000..9a7a980
--- /dev/null
@@ -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 (file)
index 0000000..cf3c8e1
--- /dev/null
@@ -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