* qatar/master: lavfi: add select filter oggdec: fix out of bound write in the ogg demuxer movenc: create an alternate group for each media type lavd: add libcdio-paranoia input device for audio CD grabbing rawdec: refactor private option for raw video demuxers pcmdec: use unique classes for all pcm demuxers. rawdec: g722 is always 1 channel/16kHz Conflicts: Changelog configure doc/filters.texi libavdevice/avdevice.h libavfilter/avfilter.h libavfilter/vf_select.c tests/ref/lavf/mov Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -57,6 +57,7 @@ easier to use. The changes are: | |||||
| - BIN/XBIN/ADF/IDF text file decoder | - BIN/XBIN/ADF/IDF text file decoder | ||||
| - aconvert audio filter added | - aconvert audio filter added | ||||
| - audio support to lavfi input device added | - audio support to lavfi input device added | ||||
| - libcdio-paranoia input device for audio CD grabbing | |||||
| version 0.8: | version 0.8: | ||||
| @@ -167,6 +167,7 @@ External library support: | |||||
| --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no] | --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no] | ||||
| --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no] | --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no] | ||||
| --enable-libopencv enable video filtering via libopencv [no] | --enable-libopencv enable video filtering via libopencv [no] | ||||
| --enable-libcdio enable audio CD grabbing with libcdio | |||||
| --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 | --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 | ||||
| and libraw1394 [no] | and libraw1394 [no] | ||||
| --enable-libdirac enable Dirac support via libdirac [no] | --enable-libdirac enable Dirac support via libdirac [no] | ||||
| @@ -992,6 +993,7 @@ CONFIG_LIST=" | |||||
| h264pred | h264pred | ||||
| hardcoded_tables | hardcoded_tables | ||||
| huffman | huffman | ||||
| libcdio | |||||
| libcelt | libcelt | ||||
| libdc1394 | libdc1394 | ||||
| libdirac | libdirac | ||||
| @@ -1548,6 +1550,7 @@ dv1394_indev_deps="dv1394 dv_demuxer" | |||||
| fbdev_indev_deps="linux_fb_h" | fbdev_indev_deps="linux_fb_h" | ||||
| jack_indev_deps="jack_jack_h sem_timedwait" | jack_indev_deps="jack_jack_h sem_timedwait" | ||||
| lavfi_indev_deps="avfilter" | lavfi_indev_deps="avfilter" | ||||
| libcdio_indev_deps="libcdio" | |||||
| libdc1394_indev_deps="libdc1394" | libdc1394_indev_deps="libdc1394" | ||||
| openal_indev_deps="openal" | openal_indev_deps="openal" | ||||
| oss_indev_deps_any="soundcard_h sys_soundcard_h" | oss_indev_deps_any="soundcard_h sys_soundcard_h" | ||||
| @@ -2669,6 +2672,7 @@ die_license_disabled() { | |||||
| enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; } | enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; } | ||||
| } | } | ||||
| die_license_disabled gpl libcdio | |||||
| die_license_disabled gpl libx264 | die_license_disabled gpl libx264 | ||||
| die_license_disabled gpl libxavs | die_license_disabled gpl libxavs | ||||
| die_license_disabled gpl libxvid | die_license_disabled gpl libxvid | ||||
| @@ -3092,6 +3096,9 @@ enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_fu | |||||
| enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio | enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio | ||||
| enabled libcdio && | |||||
| check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open "-lcdio_paranoia -lcdio_cdda -lcdio" | |||||
| enabled x11grab && | enabled x11grab && | ||||
| check_header X11/Xlib.h && | check_header X11/Xlib.h && | ||||
| check_header X11/extensions/XShm.h && | check_header X11/extensions/XShm.h && | ||||
| @@ -3315,6 +3322,7 @@ echo "libvdpau enabled ${vdpau-no}" | |||||
| echo "AVISynth enabled ${avisynth-no}" | echo "AVISynth enabled ${avisynth-no}" | ||||
| echo "libcelt enabled ${libcelt-no}" | echo "libcelt enabled ${libcelt-no}" | ||||
| echo "frei0r enabled ${frei0r-no}" | echo "frei0r enabled ${frei0r-no}" | ||||
| echo "libcdio support ${libcdio-no}" | |||||
| echo "libdc1394 support ${libdc1394-no}" | echo "libdc1394 support ${libdc1394-no}" | ||||
| echo "libdirac enabled ${libdirac-no}" | echo "libdirac enabled ${libdirac-no}" | ||||
| echo "libfaac enabled ${libfaac-no}" | echo "libfaac enabled ${libfaac-no}" | ||||
| @@ -1680,26 +1680,26 @@ the PTS of the first video frame in the video, NAN if undefined | |||||
| the time of the first video frame in the video, NAN if undefined | the time of the first video frame in the video, NAN if undefined | ||||
| @item pict_type | @item pict_type | ||||
| the picture type of the filtered frame, can assume one of the following | |||||
| the type of the filtered frame, can assume one of the following | |||||
| values: | values: | ||||
| @table @option | @table @option | ||||
| @item PICT_TYPE_I | |||||
| @item PICT_TYPE_P | |||||
| @item PICT_TYPE_B | |||||
| @item PICT_TYPE_S | |||||
| @item PICT_TYPE_SI | |||||
| @item PICT_TYPE_SP | |||||
| @item PICT_TYPE_BI | |||||
| @item I | |||||
| @item P | |||||
| @item B | |||||
| @item S | |||||
| @item SI | |||||
| @item SP | |||||
| @item BI | |||||
| @end table | @end table | ||||
| @item interlace_type | @item interlace_type | ||||
| the frame interlace type, can assume one of the following values: | the frame interlace type, can assume one of the following values: | ||||
| @table @option | @table @option | ||||
| @item INTERLACE_TYPE_P | |||||
| @item PROGRESSIVE | |||||
| the frame is progressive (not interlaced) | the frame is progressive (not interlaced) | ||||
| @item INTERLACE_TYPE_T | |||||
| @item TOPFIRST | |||||
| the frame is top-field-first | the frame is top-field-first | ||||
| @item INTERLACE_TYPE_B | |||||
| @item BOTTOMFIRST | |||||
| the frame is bottom-field-first | the frame is bottom-field-first | ||||
| @end table | @end table | ||||
| @@ -1726,7 +1726,7 @@ select=1 | |||||
| select=0 | select=0 | ||||
| # select only I-frames | # select only I-frames | ||||
| select='eq(pict_type\,PICT_TYPE_I)' | |||||
| select='eq(pict_type\,I)' | |||||
| # select one frame every 100 | # select one frame every 100 | ||||
| select='not(mod(n\,100))' | select='not(mod(n\,100))' | ||||
| @@ -1735,7 +1735,7 @@ select='not(mod(n\,100))' | |||||
| select='gte(t\,10)*lte(t\,20)' | select='gte(t\,10)*lte(t\,20)' | ||||
| # select only I frames contained in the 10-20 time interval | # select only I frames contained in the 10-20 time interval | ||||
| select='gte(t\,10)*lte(t\,20)*eq(pict_type\,PICT_TYPE_I)' | |||||
| select='gte(t\,10)*lte(t\,20)*eq(pict_type\,I)' | |||||
| # select frames with a minimum distance of 10 seconds | # select frames with a minimum distance of 10 seconds | ||||
| select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)' | select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)' | ||||
| @@ -33,6 +33,7 @@ OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o | |||||
| OBJS-$(CONFIG_X11_GRAB_DEVICE_INDEV) += x11grab.o | OBJS-$(CONFIG_X11_GRAB_DEVICE_INDEV) += x11grab.o | ||||
| # external libraries | # external libraries | ||||
| OBJS-$(CONFIG_LIBCDIO_INDEV) += libcdio.o | |||||
| OBJS-$(CONFIG_LIBDC1394_INDEV) += libdc1394.o | OBJS-$(CONFIG_LIBDC1394_INDEV) += libdc1394.o | ||||
| SKIPHEADERS-$(HAVE_ALSA_ASOUNDLIB_H) += alsa-audio.h | SKIPHEADERS-$(HAVE_ALSA_ASOUNDLIB_H) += alsa-audio.h | ||||
| @@ -57,5 +57,6 @@ void avdevice_register_all(void) | |||||
| REGISTER_INDEV (X11_GRAB_DEVICE, x11_grab_device); | REGISTER_INDEV (X11_GRAB_DEVICE, x11_grab_device); | ||||
| /* external libraries */ | /* external libraries */ | ||||
| REGISTER_INDEV (LIBCDIO, libcdio); | |||||
| REGISTER_INDEV (LIBDC1394, libdc1394); | REGISTER_INDEV (LIBDC1394, libdc1394); | ||||
| } | } | ||||
| @@ -23,8 +23,8 @@ | |||||
| #include "libavformat/avformat.h" | #include "libavformat/avformat.h" | ||||
| #define LIBAVDEVICE_VERSION_MAJOR 53 | #define LIBAVDEVICE_VERSION_MAJOR 53 | ||||
| #define LIBAVDEVICE_VERSION_MINOR 3 | |||||
| #define LIBAVDEVICE_VERSION_MICRO 3 | |||||
| #define LIBAVDEVICE_VERSION_MINOR 4 | |||||
| #define LIBAVDEVICE_VERSION_MICRO 0 | |||||
| #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | ||||
| LIBAVDEVICE_VERSION_MINOR, \ | LIBAVDEVICE_VERSION_MINOR, \ | ||||
| @@ -0,0 +1,186 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Anton Khirnov <anton@khirnov.net> | |||||
| * | |||||
| * 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 | |||||
| */ | |||||
| /** | |||||
| * @file | |||||
| * libcdio CD grabbing | |||||
| */ | |||||
| #include <cdio/cdda.h> | |||||
| #include <cdio/paranoia.h> | |||||
| #include "libavutil/log.h" | |||||
| #include "libavutil/mem.h" | |||||
| #include "libavutil/opt.h" | |||||
| #include "libavformat/avformat.h" | |||||
| #include "libavformat/internal.h" | |||||
| /* cdio returns some malloced strings that need to be free()d */ | |||||
| #undef free | |||||
| typedef struct CDIOContext { | |||||
| cdrom_drive_t *drive; | |||||
| cdrom_paranoia_t *paranoia; | |||||
| int32_t last_sector; | |||||
| /* private options */ | |||||
| int speed; | |||||
| int paranoia_mode; | |||||
| } CDIOContext; | |||||
| static av_cold int read_header(AVFormatContext *ctx, AVFormatParameters *ap) | |||||
| { | |||||
| CDIOContext *s = ctx->priv_data; | |||||
| AVStream *st; | |||||
| int ret, i; | |||||
| char *err = NULL; | |||||
| if (!(st = av_new_stream(ctx, 0))) | |||||
| return AVERROR(ENOMEM); | |||||
| s->drive = cdio_cddap_identify(ctx->filename, CDDA_MESSAGE_LOGIT, &err); | |||||
| if (!s->drive) { | |||||
| av_log(ctx, AV_LOG_ERROR, "Could not open drive %s.\n", ctx->filename); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| if (err) { | |||||
| av_log(ctx, AV_LOG_VERBOSE, "%s\n", err); | |||||
| free(err); | |||||
| } | |||||
| if ((ret = cdio_cddap_open(s->drive)) < 0 || !s->drive->opened) { | |||||
| av_log(ctx, AV_LOG_ERROR, "Could not open disk in drive %s.\n", ctx->filename); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| cdio_cddap_verbose_set(s->drive, CDDA_MESSAGE_LOGIT, CDDA_MESSAGE_LOGIT); | |||||
| if (s->speed) | |||||
| cdio_cddap_speed_set(s->drive, s->speed); | |||||
| s->paranoia = cdio_paranoia_init(s->drive); | |||||
| if (!s->paranoia) { | |||||
| av_log(ctx, AV_LOG_ERROR, "Could not init paranoia.\n"); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| cdio_paranoia_modeset(s->paranoia, s->paranoia_mode); | |||||
| st->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |||||
| if (s->drive->bigendianp) | |||||
| st->codec->codec_id = CODEC_ID_PCM_S16BE; | |||||
| else | |||||
| st->codec->codec_id = CODEC_ID_PCM_S16LE; | |||||
| st->codec->sample_rate = 44100; | |||||
| st->codec->channels = 2; | |||||
| if (s->drive->audio_last_sector != CDIO_INVALID_LSN && | |||||
| s->drive->audio_first_sector != CDIO_INVALID_LSN) | |||||
| st->duration = s->drive->audio_last_sector - s->drive->audio_first_sector; | |||||
| else if (s->drive->tracks) | |||||
| st->duration = s->drive->disc_toc[s->drive->tracks].dwStartSector; | |||||
| av_set_pts_info(st, 64, CDIO_CD_FRAMESIZE_RAW, 2*st->codec->channels*st->codec->sample_rate); | |||||
| for (i = 0; i < s->drive->tracks; i++) { | |||||
| char title[16]; | |||||
| snprintf(title, sizeof(title), "track %02d", s->drive->disc_toc[i].bTrack); | |||||
| ff_new_chapter(ctx, i, st->time_base, s->drive->disc_toc[i].dwStartSector, | |||||
| s->drive->disc_toc[i+1].dwStartSector, title); | |||||
| } | |||||
| s->last_sector = cdio_cddap_disc_lastsector(s->drive); | |||||
| return 0; | |||||
| } | |||||
| static int read_packet(AVFormatContext *ctx, AVPacket *pkt) | |||||
| { | |||||
| CDIOContext *s = ctx->priv_data; | |||||
| int ret; | |||||
| uint16_t *buf; | |||||
| char *err = NULL; | |||||
| if (ctx->streams[0]->cur_dts > s->last_sector) | |||||
| return AVERROR_EOF; | |||||
| buf = cdio_paranoia_read(s->paranoia, NULL); | |||||
| if (!buf) | |||||
| return AVERROR_EOF; | |||||
| if (err = cdio_cddap_errors(s->drive)) { | |||||
| av_log(ctx, AV_LOG_ERROR, "%s\n", err); | |||||
| free(err); | |||||
| err = NULL; | |||||
| } | |||||
| if (err = cdio_cddap_messages(s->drive)) { | |||||
| av_log(ctx, AV_LOG_VERBOSE, "%s\n", err); | |||||
| free(err); | |||||
| err = NULL; | |||||
| } | |||||
| if ((ret = av_new_packet(pkt, CDIO_CD_FRAMESIZE_RAW)) < 0) | |||||
| return ret; | |||||
| memcpy(pkt->data, buf, CDIO_CD_FRAMESIZE_RAW); | |||||
| return 0; | |||||
| } | |||||
| static av_cold int read_close(AVFormatContext *ctx) | |||||
| { | |||||
| CDIOContext *s = ctx->priv_data; | |||||
| cdio_paranoia_free(s->paranoia); | |||||
| cdio_cddap_close(s->drive); | |||||
| return 0; | |||||
| } | |||||
| static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, | |||||
| int flags) | |||||
| { | |||||
| CDIOContext *s = ctx->priv_data; | |||||
| AVStream *st = ctx->streams[0]; | |||||
| cdio_paranoia_seek(s->paranoia, timestamp, SEEK_SET); | |||||
| st->cur_dts = timestamp; | |||||
| return 0; | |||||
| } | |||||
| #define OFFSET(x) offsetof(CDIOContext, x) | |||||
| #define DEC AV_OPT_FLAG_DECODING_PARAM | |||||
| static const AVOption options[] = { | |||||
| { "speed", "Drive reading speed.", OFFSET(speed), FF_OPT_TYPE_INT, { 0 }, 0, INT_MAX, DEC }, | |||||
| { "paranoia_mode", "Error recovery mode.", OFFSET(paranoia_mode), FF_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX, DEC, "paranoia_mode" }, | |||||
| { "verify", "Verify data integrity in overlap area", 0, FF_OPT_TYPE_CONST, { PARANOIA_MODE_VERIFY }, 0, 0, DEC, "paranoia_mode" }, | |||||
| { "overlap", "Perform overlapped reads.", 0, FF_OPT_TYPE_CONST, { PARANOIA_MODE_OVERLAP }, 0, 0, DEC, "paranoia_mode" }, | |||||
| { "neverskip", "Do not skip failed reads.", 0, FF_OPT_TYPE_CONST, { PARANOIA_MODE_NEVERSKIP }, 0, 0, DEC, "paranoia_mode" }, | |||||
| { NULL }, | |||||
| }; | |||||
| static const AVClass libcdio_class = { | |||||
| .class_name = "libcdio indev", | |||||
| .item_name = av_default_item_name, | |||||
| .option = options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| AVInputFormat ff_libcdio_demuxer = { | |||||
| .name = "libcdio", | |||||
| .read_header = read_header, | |||||
| .read_packet = read_packet, | |||||
| .read_close = read_close, | |||||
| .read_seek = read_seek, | |||||
| .priv_data_size = sizeof(CDIOContext), | |||||
| .flags = AVFMT_NOFILE, | |||||
| .priv_class = &libcdio_class, | |||||
| }; | |||||
| @@ -45,18 +45,18 @@ static const char *var_names[] = { | |||||
| "prev_selected_t", ///< previously selected time | "prev_selected_t", ///< previously selected time | ||||
| "pict_type", ///< the type of picture in the movie | "pict_type", ///< the type of picture in the movie | ||||
| "PICT_TYPE_I", | |||||
| "PICT_TYPE_P", | |||||
| "PICT_TYPE_B", | |||||
| "PICT_TYPE_S", | |||||
| "PICT_TYPE_SI", | |||||
| "PICT_TYPE_SP", | |||||
| "PICT_TYPE_BI", | |||||
| "I", | |||||
| "P", | |||||
| "B", | |||||
| "S", | |||||
| "SI", | |||||
| "SP", | |||||
| "BI", | |||||
| "interlace_type", ///< the frame interlace type | "interlace_type", ///< the frame interlace type | ||||
| "INTERLACE_TYPE_P", | |||||
| "INTERLACE_TYPE_T", | |||||
| "INTERLACE_TYPE_B", | |||||
| "PROGRESSIVE", | |||||
| "TOPFIRST", | |||||
| "BOTTOMFIRST", | |||||
| "n", ///< frame number (starting from zero) | "n", ///< frame number (starting from zero) | ||||
| "selected_n", ///< selected frame number (starting from zero) | "selected_n", ///< selected frame number (starting from zero) | ||||
| @@ -317,19 +317,14 @@ static av_cold void uninit(AVFilterContext *ctx) | |||||
| { | { | ||||
| SelectContext *select = ctx->priv; | SelectContext *select = ctx->priv; | ||||
| AVFilterBufferRef *picref; | AVFilterBufferRef *picref; | ||||
| int i; | |||||
| if (select->expr) | |||||
| av_expr_free(select->expr); | |||||
| av_expr_free(select->expr); | |||||
| select->expr = NULL; | select->expr = NULL; | ||||
| if (select->pending_frames) { | |||||
| for (i = 0; i < av_fifo_size(select->pending_frames)/sizeof(picref); i++) { | |||||
| av_fifo_generic_read(select->pending_frames, &picref, sizeof(picref), NULL); | |||||
| avfilter_unref_buffer(picref); | |||||
| } | |||||
| av_fifo_free(select->pending_frames); | |||||
| } | |||||
| while (select->pending_frames && | |||||
| av_fifo_generic_read(select->pending_frames, &picref, sizeof(picref), NULL) == sizeof(picref)) | |||||
| avfilter_unref_buffer(picref); | |||||
| av_fifo_free(select->pending_frames); | |||||
| select->pending_frames = NULL; | select->pending_frames = NULL; | ||||
| } | } | ||||
| @@ -58,6 +58,8 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| FF_RAWVIDEO_DEMUXER_CLASS(ingenient) | |||||
| AVInputFormat ff_ingenient_demuxer = { | AVInputFormat ff_ingenient_demuxer = { | ||||
| .name = "ingenient", | .name = "ingenient", | ||||
| .long_name = NULL_IF_CONFIG_SMALL("raw Ingenient MJPEG"), | .long_name = NULL_IF_CONFIG_SMALL("raw Ingenient MJPEG"), | ||||
| @@ -67,5 +69,5 @@ AVInputFormat ff_ingenient_demuxer = { | |||||
| .flags= AVFMT_GENERIC_INDEX, | .flags= AVFMT_GENERIC_INDEX, | ||||
| .extensions = "cgi", // FIXME | .extensions = "cgi", // FIXME | ||||
| .value = CODEC_ID_MJPEG, | .value = CODEC_ID_MJPEG, | ||||
| .priv_class = &ff_rawvideo_demuxer_class, | |||||
| .priv_class = &ingenient_demuxer_class, | |||||
| }; | }; | ||||
| @@ -1225,7 +1225,8 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st) | |||||
| avio_wb32(pb, 0); /* reserved */ | avio_wb32(pb, 0); /* reserved */ | ||||
| avio_wb32(pb, 0); /* reserved */ | avio_wb32(pb, 0); /* reserved */ | ||||
| avio_wb32(pb, 0x0); /* reserved (Layer & Alternate group) */ | |||||
| avio_wb16(pb, 0); /* layer */ | |||||
| avio_wb16(pb, st->codec->codec_type); /* alternate group) */ | |||||
| /* Volume, only for audio */ | /* Volume, only for audio */ | ||||
| if(track->enc->codec_type == AVMEDIA_TYPE_AUDIO) | if(track->enc->codec_type == AVMEDIA_TYPE_AUDIO) | ||||
| avio_wb16(pb, 0x0100); | avio_wb16(pb, 0x0100); | ||||
| @@ -22,6 +22,8 @@ | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "rawdec.h" | #include "rawdec.h" | ||||
| #include "pcm.h" | #include "pcm.h" | ||||
| #include "libavutil/log.h" | |||||
| #include "libavutil/opt.h" | |||||
| #define RAW_SAMPLES 1024 | #define RAW_SAMPLES 1024 | ||||
| @@ -46,7 +48,19 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| static const AVOption pcm_options[] = { | |||||
| { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | |||||
| { "channels", "", offsetof(RawAudioDemuxerContext, channels), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | |||||
| { NULL }, | |||||
| }; | |||||
| #define PCMDEF(name, long_name, ext, codec) \ | #define PCMDEF(name, long_name, ext, codec) \ | ||||
| static const AVClass name ## _demuxer_class = {\ | |||||
| .class_name = #name " demuxer",\ | |||||
| .item_name = av_default_item_name,\ | |||||
| .option = pcm_options,\ | |||||
| .version = LIBAVUTIL_VERSION_INT,\ | |||||
| };\ | |||||
| AVInputFormat ff_pcm_ ## name ## _demuxer = {\ | AVInputFormat ff_pcm_ ## name ## _demuxer = {\ | ||||
| #name,\ | #name,\ | ||||
| NULL_IF_CONFIG_SMALL(long_name),\ | NULL_IF_CONFIG_SMALL(long_name),\ | ||||
| @@ -59,7 +73,7 @@ AVInputFormat ff_pcm_ ## name ## _demuxer = {\ | |||||
| .flags= AVFMT_GENERIC_INDEX,\ | .flags= AVFMT_GENERIC_INDEX,\ | ||||
| .extensions = ext,\ | .extensions = ext,\ | ||||
| .value = codec,\ | .value = codec,\ | ||||
| .priv_class = &ff_rawaudio_demuxer_class,\ | |||||
| .priv_class = &name ## _demuxer_class,\ | |||||
| }; | }; | ||||
| PCMDEF(f64be, "PCM 64 bit floating-point big-endian format", | PCMDEF(f64be, "PCM 64 bit floating-point big-endian format", | ||||
| @@ -51,9 +51,12 @@ int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| st->codec->channels = 1; | st->codec->channels = 1; | ||||
| if (s1->sample_rate) | |||||
| if (id == CODEC_ID_ADPCM_G722) | |||||
| st->codec->sample_rate = 16000; | |||||
| if (s1 && s1->sample_rate) | |||||
| st->codec->sample_rate = s1->sample_rate; | st->codec->sample_rate = s1->sample_rate; | ||||
| if (s1->channels) | |||||
| if (s1 && s1->channels) | |||||
| st->codec->channels = s1->channels; | st->codec->channels = s1->channels; | ||||
| st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id); | st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id); | ||||
| @@ -165,48 +168,22 @@ fail: | |||||
| /* Note: Do not forget to add new entries to the Makefile as well. */ | /* Note: Do not forget to add new entries to the Makefile as well. */ | ||||
| static const AVOption audio_options[] = { | |||||
| { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | |||||
| { "channels", "", offsetof(RawAudioDemuxerContext, channels), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | |||||
| { NULL }, | |||||
| }; | |||||
| const AVClass ff_rawaudio_demuxer_class = { | |||||
| .class_name = "rawaudio demuxer", | |||||
| .item_name = av_default_item_name, | |||||
| .option = audio_options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) | #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) | ||||
| #define DEC AV_OPT_FLAG_DECODING_PARAM | #define DEC AV_OPT_FLAG_DECODING_PARAM | ||||
| static const AVOption video_options[] = { | |||||
| { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, | |||||
| { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC }, | |||||
| { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, | |||||
| const AVOption ff_rawvideo_options[] = { | |||||
| { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC}, | |||||
| { NULL }, | { NULL }, | ||||
| }; | }; | ||||
| #undef OFFSET | |||||
| #undef DEC | |||||
| const AVClass ff_rawvideo_demuxer_class = { | |||||
| .class_name = "rawvideo demuxer", | |||||
| .item_name = av_default_item_name, | |||||
| .option = video_options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| #if CONFIG_G722_DEMUXER | #if CONFIG_G722_DEMUXER | ||||
| AVInputFormat ff_g722_demuxer = { | AVInputFormat ff_g722_demuxer = { | ||||
| .name = "g722", | .name = "g722", | ||||
| .long_name = NULL_IF_CONFIG_SMALL("raw G.722"), | .long_name = NULL_IF_CONFIG_SMALL("raw G.722"), | ||||
| .priv_data_size = sizeof(RawAudioDemuxerContext), | |||||
| .read_header = ff_raw_read_header, | .read_header = ff_raw_read_header, | ||||
| .read_packet = ff_raw_read_partial_packet, | .read_packet = ff_raw_read_partial_packet, | ||||
| .flags= AVFMT_GENERIC_INDEX, | .flags= AVFMT_GENERIC_INDEX, | ||||
| .extensions = "g722,722", | .extensions = "g722,722", | ||||
| .value = CODEC_ID_ADPCM_G722, | .value = CODEC_ID_ADPCM_G722, | ||||
| .priv_class = &ff_rawaudio_demuxer_class, | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "libavutil/log.h" | #include "libavutil/log.h" | ||||
| #include "libavutil/opt.h" | |||||
| typedef struct RawAudioDemuxerContext { | typedef struct RawAudioDemuxerContext { | ||||
| AVClass *class; | AVClass *class; | ||||
| @@ -38,8 +39,7 @@ typedef struct FFRawVideoDemuxerContext { | |||||
| char *framerate; /**< String describing framerate, set by a private option. */ | char *framerate; /**< String describing framerate, set by a private option. */ | ||||
| } FFRawVideoDemuxerContext; | } FFRawVideoDemuxerContext; | ||||
| extern const AVClass ff_rawaudio_demuxer_class; | |||||
| extern const AVClass ff_rawvideo_demuxer_class; | |||||
| extern const AVOption ff_rawvideo_options[]; | |||||
| int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap); | int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap); | ||||
| @@ -49,7 +49,16 @@ int ff_raw_audio_read_header(AVFormatContext *s, AVFormatParameters *ap); | |||||
| int ff_raw_video_read_header(AVFormatContext *s, AVFormatParameters *ap); | int ff_raw_video_read_header(AVFormatContext *s, AVFormatParameters *ap); | ||||
| #define FF_RAWVIDEO_DEMUXER_CLASS(name)\ | |||||
| static const AVClass name ## _demuxer_class = {\ | |||||
| .class_name = #name " demuxer",\ | |||||
| .item_name = av_default_item_name,\ | |||||
| .option = ff_rawvideo_options,\ | |||||
| .version = LIBAVUTIL_VERSION_INT,\ | |||||
| }; | |||||
| #define FF_DEF_RAWVIDEO_DEMUXER(shortname, longname, probe, ext, id)\ | #define FF_DEF_RAWVIDEO_DEMUXER(shortname, longname, probe, ext, id)\ | ||||
| FF_RAWVIDEO_DEMUXER_CLASS(shortname)\ | |||||
| AVInputFormat ff_ ## shortname ## _demuxer = {\ | AVInputFormat ff_ ## shortname ## _demuxer = {\ | ||||
| .name = #shortname,\ | .name = #shortname,\ | ||||
| .long_name = NULL_IF_CONFIG_SMALL(longname),\ | .long_name = NULL_IF_CONFIG_SMALL(longname),\ | ||||
| @@ -60,7 +69,7 @@ AVInputFormat ff_ ## shortname ## _demuxer = {\ | |||||
| .flags = AVFMT_GENERIC_INDEX,\ | .flags = AVFMT_GENERIC_INDEX,\ | ||||
| .value = id,\ | .value = id,\ | ||||
| .priv_data_size = sizeof(FFRawVideoDemuxerContext),\ | .priv_data_size = sizeof(FFRawVideoDemuxerContext),\ | ||||
| .priv_class = &ff_rawvideo_demuxer_class,\ | |||||
| .priv_class = &shortname ## _demuxer_class,\ | |||||
| }; | }; | ||||
| #endif /* AVFORMAT_RAWDEC_H */ | #endif /* AVFORMAT_RAWDEC_H */ | ||||
| @@ -44,6 +44,22 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) | |||||
| #define DEC AV_OPT_FLAG_DECODING_PARAM | |||||
| static const AVOption rawvideo_options[] = { | |||||
| { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, | |||||
| { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC }, | |||||
| { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, | |||||
| { NULL }, | |||||
| }; | |||||
| static const AVClass rawvideo_demuxer_class = { | |||||
| .class_name = "rawvideo demuxer", | |||||
| .item_name = av_default_item_name, | |||||
| .option = rawvideo_options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| AVInputFormat ff_rawvideo_demuxer = { | AVInputFormat ff_rawvideo_demuxer = { | ||||
| .name = "rawvideo", | .name = "rawvideo", | ||||
| .long_name = NULL_IF_CONFIG_SMALL("raw video format"), | .long_name = NULL_IF_CONFIG_SMALL("raw video format"), | ||||
| @@ -53,5 +69,5 @@ AVInputFormat ff_rawvideo_demuxer = { | |||||
| .flags= AVFMT_GENERIC_INDEX, | .flags= AVFMT_GENERIC_INDEX, | ||||
| .extensions = "yuv,cif,qcif,rgb", | .extensions = "yuv,cif,qcif,rgb", | ||||
| .value = CODEC_ID_RAWVIDEO, | .value = CODEC_ID_RAWVIDEO, | ||||
| .priv_class = &ff_rawvideo_demuxer_class, | |||||
| .priv_class = &rawvideo_demuxer_class, | |||||
| }; | }; | ||||
| @@ -131,7 +131,7 @@ FATE_TESTS += fate-gsm-ms | |||||
| fate-gsm-ms: CMD = framecrc -i $(SAMPLES)/gsm/ciao.wav | fate-gsm-ms: CMD = framecrc -i $(SAMPLES)/gsm/ciao.wav | ||||
| FATE_TESTS += fate-g722dec-1 | FATE_TESTS += fate-g722dec-1 | ||||
| fate-g722dec-1: CMD = framecrc -ar 16000 -i $(SAMPLES)/g722/conf-adminmenu-162.g722 | |||||
| fate-g722dec-1: CMD = framecrc -i $(SAMPLES)/g722/conf-adminmenu-162.g722 | |||||
| FATE_TESTS += fate-msmpeg4v1 | FATE_TESTS += fate-msmpeg4v1 | ||||
| fate-msmpeg4v1: CMD = framecrc -flags +bitexact -dct fastint -idct simple -i $(SAMPLES)/msmpeg4v1/mpg4.avi -an | fate-msmpeg4v1: CMD = framecrc -flags +bitexact -dct fastint -idct simple -i $(SAMPLES)/msmpeg4v1/mpg4.avi -an | ||||
| @@ -1,4 +1,4 @@ | |||||
| c68f649777ab8e7c9a0f1f221451d3ad *./tests/data/acodec/alac.m4a | |||||
| b25bcc7ec3f5c19cdfc01a6bbd32edb8 *./tests/data/acodec/alac.m4a | |||||
| 389386 ./tests/data/acodec/alac.m4a | 389386 ./tests/data/acodec/alac.m4a | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/alac.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/alac.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| @@ -6,7 +6,7 @@ f443a8eeb1647ec1eeb8370c939e52d4 *./tests/data/acodec/pcm_mulaw.wav | |||||
| 529256 ./tests/data/acodec/pcm_mulaw.wav | 529256 ./tests/data/acodec/pcm_mulaw.wav | ||||
| 1c3eeaa8814ebd4916780dff80ed6dc5 *./tests/data/pcm.acodec.out.wav | 1c3eeaa8814ebd4916780dff80ed6dc5 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400 | stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400 | ||||
| b7936d7170e0efefb379349d81aed360 *./tests/data/acodec/pcm_s8.mov | |||||
| 760f85fb9f4e8aba326fb44ae84c9507 *./tests/data/acodec/pcm_s8.mov | |||||
| 530837 ./tests/data/acodec/pcm_s8.mov | 530837 ./tests/data/acodec/pcm_s8.mov | ||||
| 652edf30f35ad89bf27bcc9d2f9c7b53 *./tests/data/pcm.acodec.out.wav | 652edf30f35ad89bf27bcc9d2f9c7b53 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 | stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 | ||||
| @@ -14,7 +14,7 @@ stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 | |||||
| 529244 ./tests/data/acodec/pcm_u8.wav | 529244 ./tests/data/acodec/pcm_u8.wav | ||||
| 652edf30f35ad89bf27bcc9d2f9c7b53 *./tests/data/pcm.acodec.out.wav | 652edf30f35ad89bf27bcc9d2f9c7b53 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 | stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 | ||||
| c42b9c04305455250366c84e17c1023f *./tests/data/acodec/pcm_s16be.mov | |||||
| a4e18d1ca9ef5b8132a84d43625ddc47 *./tests/data/acodec/pcm_s16be.mov | |||||
| 1060037 ./tests/data/acodec/pcm_s16be.mov | 1060037 ./tests/data/acodec/pcm_s16be.mov | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| @@ -30,7 +30,7 @@ c4f51bf32fad2f7af8ea5beedb56168b *./tests/data/acodec/pcm_s16le.mkv | |||||
| 1060638 ./tests/data/acodec/pcm_s16le.mkv | 1060638 ./tests/data/acodec/pcm_s16le.mkv | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| 07ffe7ffb78f3648b6524debdde5aec1 *./tests/data/acodec/pcm_s24be.mov | |||||
| 971d2d2633e41a0326fe2d04a2d0350f *./tests/data/acodec/pcm_s24be.mov | |||||
| 1589237 ./tests/data/acodec/pcm_s24be.mov | 1589237 ./tests/data/acodec/pcm_s24be.mov | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| @@ -38,7 +38,7 @@ a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav | |||||
| 1587668 ./tests/data/acodec/pcm_s24le.wav | 1587668 ./tests/data/acodec/pcm_s24le.wav | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| d7792f0343cd66fda8b50b569e2bcc48 *./tests/data/acodec/pcm_s32be.mov | |||||
| fc4f4e3e195bbde037ed31021d229f12 *./tests/data/acodec/pcm_s32be.mov | |||||
| 2118437 ./tests/data/acodec/pcm_s32be.mov | 2118437 ./tests/data/acodec/pcm_s32be.mov | ||||
| 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | 95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/pcm.acodec.out.wav | ||||
| stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 | ||||
| @@ -1,3 +1,3 @@ | |||||
| a901cd05609080e8f5c09ca5da7290f0 *./tests/data/lavf/lavf.mov | |||||
| 2e2529d01dbe42e4dd63580a351898f5 *./tests/data/lavf/lavf.mov | |||||
| 357681 ./tests/data/lavf/lavf.mov | 357681 ./tests/data/lavf/lavf.mov | ||||
| ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26 | ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26 | ||||