diff --git a/Changelog b/Changelog index 228293ff36d52..2a20c357c4b0f 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 d0c9aabaf4f53..4c99a6fdd7023 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;inb_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 854d7a597de9d..14e02f8f95313 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 88d8b375539a2..3ad503dc834a2 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 : 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 3ff275d8e277e..1b9a494f49f46 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 c77cb78eb9187..fc4ee1cf3aeab 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 04f29e59b3201..6410ed47f3856 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 19afbd48953a9..9e130477dd0c8 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 26502b9f7ff9f..23048ddb7210e 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 ed0eede5bf153..7ae3e7eeeb5a8 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 0000000000000..5f67fbdbef6f5 --- /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 fb457f234a492..f3bca86db227d 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= w * bytes_per_pixel; y++) { #if HAVE_BIGENDIAN unsigned int x; for (x=0; xpicture; *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 3c4c152213ca9..2c3539e44fb1d 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 64252029d36f5..1f3506d1580de 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -21,6 +21,12 @@ #ifndef AVFORMAT_AVFORMAT_H #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 88fe1577ff13a..7cf14f9f8c87a 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 8f855bb02d874..163d2fac613fc 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 cfbdc890af3b0..e16c14bf535f7 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 964085031c3ea..3cc3c354c023a 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 844cd64464a92..0fb0b18197573 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 f5c57ecccf534..7676074d1fc00 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 1db9c5e29826a..969fd95961181 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 0000000000000..5d2b73ca8acfb --- /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 0000000000000..69141537b98f2 --- /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 0000000000000..7d3800e970098 --- /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 0000000000000..7d3800e970098 --- /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 0000000000000..bdb90a61683c0 --- /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 0000000000000..5cd3bc84ee047 --- /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 0000000000000..d68bf4e26e47f --- /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 0000000000000..d68bf4e26e47f --- /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 0000000000000..9a7a980b41335 --- /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 0000000000000..cf3c8e1abf9be --- /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