* qatar/master: (26 commits) adxenc: use AVCodec.encode2() adxenc: Use the AVFrame in ADXContext for coded_frame indeo4: fix out-of-bounds function call. configure: Restructure help output. configure: Internal-only components should not be command-line selectable. vorbisenc: use AVCodec.encode2() libvorbis: use AVCodec.encode2() libopencore-amrnbenc: use AVCodec.encode2() ra144enc: use AVCodec.encode2() nellymoserenc: use AVCodec.encode2() roqaudioenc: use AVCodec.encode2() libspeex: use AVCodec.encode2() libvo_amrwbenc: use AVCodec.encode2() libvo_aacenc: use AVCodec.encode2() wmaenc: use AVCodec.encode2() mpegaudioenc: use AVCodec.encode2() libmp3lame: use AVCodec.encode2() libgsmenc: use AVCodec.encode2() libfaac: use AVCodec.encode2() g726enc: use AVCodec.encode2() ... Conflicts: configure libavcodec/Makefile libavcodec/ac3enc.c libavcodec/adxenc.c libavcodec/libgsm.c libavcodec/libvorbis.c libavcodec/vorbisenc.c libavcodec/wmaenc.c tests/ref/acodec/g722 tests/ref/lavf/asf tests/ref/lavf/ffm tests/ref/lavf/mkv tests/ref/lavf/mpg tests/ref/lavf/rm tests/ref/lavf/ts tests/ref/seek/lavf_asf tests/ref/seek/lavf_ffm tests/ref/seek/lavf_mkv tests/ref/seek/lavf_mpg tests/ref/seek/lavf_rm tests/ref/seek/lavf_ts Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.11
| @@ -59,8 +59,21 @@ cat <<EOF | |||||
| Usage: configure [options] | Usage: configure [options] | ||||
| Options: [defaults in brackets after descriptions] | Options: [defaults in brackets after descriptions] | ||||
| Standard options: | |||||
| Help options: | |||||
| --help print this message | --help print this message | ||||
| --list-decoders show all available decoders | |||||
| --list-encoders show all available encoders | |||||
| --list-hwaccels show all available hardware accelerators | |||||
| --list-demuxers show all available demuxers | |||||
| --list-muxers show all available muxers | |||||
| --list-parsers show all available parsers | |||||
| --list-protocols show all available protocols | |||||
| --list-bsfs show all available bitstream filters | |||||
| --list-indevs show all available input devices | |||||
| --list-outdevs show all available output devices | |||||
| --list-filters show all available filters | |||||
| Standard options: | |||||
| --logfile=FILE log tests and output to FILE [config.log] | --logfile=FILE log tests and output to FILE [config.log] | ||||
| --disable-logging do not log configure debug information | --disable-logging do not log configure debug information | ||||
| --prefix=PREFIX install in PREFIX [$prefix] | --prefix=PREFIX install in PREFIX [$prefix] | ||||
| @@ -71,14 +84,22 @@ Standard options: | |||||
| --incdir=DIR install includes in DIR [PREFIX/include] | --incdir=DIR install includes in DIR [PREFIX/include] | ||||
| --mandir=DIR install man page in DIR [PREFIX/share/man] | --mandir=DIR install man page in DIR [PREFIX/share/man] | ||||
| Configuration options: | |||||
| --disable-static do not build static libraries [no] | |||||
| --enable-shared build shared libraries [no] | |||||
| Licensing options: | |||||
| --enable-gpl allow use of GPL code, the resulting libs | --enable-gpl allow use of GPL code, the resulting libs | ||||
| and binaries will be under GPL [no] | and binaries will be under GPL [no] | ||||
| --enable-version3 upgrade (L)GPL to version 3 [no] | --enable-version3 upgrade (L)GPL to version 3 [no] | ||||
| --enable-nonfree allow use of nonfree code, the resulting libs | --enable-nonfree allow use of nonfree code, the resulting libs | ||||
| and binaries will be unredistributable [no] | and binaries will be unredistributable [no] | ||||
| Configuration options: | |||||
| --disable-static do not build static libraries [no] | |||||
| --enable-shared build shared libraries [no] | |||||
| --enable-small optimize for size instead of speed | |||||
| --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary) | |||||
| --enable-gray enable full grayscale support (slower color) | |||||
| --disable-swscale-alpha disable alpha channel support in swscale | |||||
| Component options: | |||||
| --disable-doc do not build documentation | --disable-doc do not build documentation | ||||
| --disable-ffmpeg disable ffmpeg build | --disable-ffmpeg disable ffmpeg build | ||||
| --disable-ffplay disable ffplay build | --disable-ffplay disable ffplay build | ||||
| @@ -96,29 +117,17 @@ Configuration options: | |||||
| --disable-os2threads disable OS/2 threads [auto] | --disable-os2threads disable OS/2 threads [auto] | ||||
| --enable-x11grab enable X11 grabbing [no] | --enable-x11grab enable X11 grabbing [no] | ||||
| --disable-network disable network support [no] | --disable-network disable network support [no] | ||||
| --enable-gray enable full grayscale support (slower color) | |||||
| --disable-swscale-alpha disable alpha channel support in swscale | |||||
| --disable-fastdiv disable table-based division | |||||
| --enable-small optimize for size instead of speed | |||||
| --disable-aandct disable AAN DCT code | |||||
| --disable-dct disable DCT code | --disable-dct disable DCT code | ||||
| --disable-fft disable FFT code | --disable-fft disable FFT code | ||||
| --disable-golomb disable Golomb code | |||||
| --disable-huffman disable Huffman code | |||||
| --disable-lpc disable LPC code | |||||
| --disable-mdct disable MDCT code | --disable-mdct disable MDCT code | ||||
| --disable-rdft disable RDFT code | --disable-rdft disable RDFT code | ||||
| --disable-fft disable FFT code | |||||
| --enable-dxva2 enable DXVA2 code | |||||
| --enable-vaapi enable VAAPI code [autodetect] | --enable-vaapi enable VAAPI code [autodetect] | ||||
| --enable-vda enable VDA code [autodetect] | |||||
| --enable-vda enable VDA code [autodetect] | |||||
| --enable-vdpau enable VDPAU code [autodetect] | --enable-vdpau enable VDPAU code [autodetect] | ||||
| --disable-dxva2 disable DXVA2 code | |||||
| --disable-vda disable VDA code | |||||
| --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary) | |||||
| --enable-hardcoded-tables use hardcoded tables instead of runtime generation | |||||
| --disable-safe-bitstream-reader | |||||
| disable buffer boundary checking in bitreaders | |||||
| (faster, but may crash) | |||||
| --enable-memalign-hack emulate memalign, interferes with memory debuggers | |||||
| Individual component options: | |||||
| --disable-everything disable all components listed below | --disable-everything disable all components listed below | ||||
| --disable-encoder=NAME disable encoder NAME | --disable-encoder=NAME disable encoder NAME | ||||
| --enable-encoder=NAME enable encoder NAME | --enable-encoder=NAME enable encoder NAME | ||||
| @@ -144,25 +153,16 @@ Configuration options: | |||||
| --enable-protocol=NAME enable protocol NAME | --enable-protocol=NAME enable protocol NAME | ||||
| --disable-protocol=NAME disable protocol NAME | --disable-protocol=NAME disable protocol NAME | ||||
| --disable-protocols disable all protocols | --disable-protocols disable all protocols | ||||
| --enable-indev=NAME enable input device NAME | |||||
| --disable-indev=NAME disable input device NAME | --disable-indev=NAME disable input device NAME | ||||
| --disable-outdev=NAME disable output device NAME | |||||
| --disable-indevs disable input devices | --disable-indevs disable input devices | ||||
| --enable-outdev=NAME enable output device NAME | |||||
| --disable-outdev=NAME disable output device NAME | |||||
| --disable-outdevs disable output devices | --disable-outdevs disable output devices | ||||
| --disable-devices disable all devices | --disable-devices disable all devices | ||||
| --enable-filter=NAME enable filter NAME | --enable-filter=NAME enable filter NAME | ||||
| --disable-filter=NAME disable filter NAME | --disable-filter=NAME disable filter NAME | ||||
| --disable-filters disable all filters | --disable-filters disable all filters | ||||
| --list-decoders show all available decoders | |||||
| --list-encoders show all available encoders | |||||
| --list-hwaccels show all available hardware accelerators | |||||
| --list-muxers show all available muxers | |||||
| --list-demuxers show all available demuxers | |||||
| --list-parsers show all available parsers | |||||
| --list-protocols show all available protocols | |||||
| --list-bsfs show all available bitstream filters | |||||
| --list-indevs show all available input devices | |||||
| --list-outdevs show all available output devices | |||||
| --list-filters show all available filters | |||||
| External library support: | External library support: | ||||
| --enable-avisynth enable reading of AVISynth script files [no] | --enable-avisynth enable reading of AVISynth script files [no] | ||||
| @@ -233,11 +233,24 @@ Advanced options (experts only): | |||||
| --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS] | --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS] | ||||
| --extra-libs=ELIBS add ELIBS [$ELIBS] | --extra-libs=ELIBS add ELIBS [$ELIBS] | ||||
| --extra-version=STRING version string suffix [] | --extra-version=STRING version string suffix [] | ||||
| --optflags override optimization-related compiler flags | |||||
| --build-suffix=SUFFIX library name suffix [] | --build-suffix=SUFFIX library name suffix [] | ||||
| --malloc-prefix=PREFIX prefix malloc and related names with PREFIX | |||||
| --progs-suffix=SUFFIX program name suffix [] | --progs-suffix=SUFFIX program name suffix [] | ||||
| --arch=ARCH select architecture [$arch] | --arch=ARCH select architecture [$arch] | ||||
| --cpu=CPU select the minimum required CPU (affects | --cpu=CPU select the minimum required CPU (affects | ||||
| instruction selection, may crash on older CPUs) | instruction selection, may crash on older CPUs) | ||||
| --enable-pic build position-independent code | |||||
| --enable-sram allow use of on-chip SRAM | |||||
| --disable-symver disable symbol versioning | |||||
| --disable-fastdiv disable table-based division | |||||
| --enable-hardcoded-tables use hardcoded tables instead of runtime generation | |||||
| --disable-safe-bitstream-reader | |||||
| disable buffer boundary checking in bitreaders | |||||
| (faster, but may crash) | |||||
| --enable-memalign-hack emulate memalign, interferes with memory debuggers | |||||
| Optimization options (experts only): | |||||
| --disable-asm disable all assembler optimizations | --disable-asm disable all assembler optimizations | ||||
| --disable-altivec disable AltiVec optimizations | --disable-altivec disable AltiVec optimizations | ||||
| --disable-amd3dnow disable 3DNow! optimizations | --disable-amd3dnow disable 3DNow! optimizations | ||||
| @@ -255,11 +268,6 @@ Advanced options (experts only): | |||||
| --disable-neon disable NEON optimizations | --disable-neon disable NEON optimizations | ||||
| --disable-vis disable VIS optimizations | --disable-vis disable VIS optimizations | ||||
| --disable-yasm disable use of yasm assembler | --disable-yasm disable use of yasm assembler | ||||
| --enable-pic build position-independent code | |||||
| --malloc-prefix=PFX prefix malloc and related names with PFX | |||||
| --enable-sram allow use of on-chip SRAM | |||||
| --disable-symver disable symbol versioning | |||||
| --optflags override optimization-related compiler flags | |||||
| --postproc-version=V build libpostproc version V. | --postproc-version=V build libpostproc version V. | ||||
| Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default] | Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default] | ||||
| @@ -999,10 +1007,6 @@ PROGRAM_LIST=" | |||||
| CONFIG_LIST=" | CONFIG_LIST=" | ||||
| $COMPONENT_LIST | $COMPONENT_LIST | ||||
| $PROGRAM_LIST | $PROGRAM_LIST | ||||
| avplay | |||||
| avprobe | |||||
| avserver | |||||
| aandct | |||||
| ac3dsp | ac3dsp | ||||
| avcodec | avcodec | ||||
| avdevice | avdevice | ||||
| @@ -1019,14 +1023,9 @@ CONFIG_LIST=" | |||||
| fft | fft | ||||
| frei0r | frei0r | ||||
| gnutls | gnutls | ||||
| golomb | |||||
| gpl | gpl | ||||
| gray | gray | ||||
| h264chroma | |||||
| h264dsp | |||||
| h264pred | |||||
| hardcoded_tables | hardcoded_tables | ||||
| huffman | |||||
| libaacplus | libaacplus | ||||
| libass | libass | ||||
| libbluray | libbluray | ||||
| @@ -1059,7 +1058,6 @@ CONFIG_LIST=" | |||||
| libx264 | libx264 | ||||
| libxavs | libxavs | ||||
| libxvid | libxvid | ||||
| lpc | |||||
| lsp | lsp | ||||
| mdct | mdct | ||||
| memalign_hack | memalign_hack | ||||
| @@ -1261,9 +1259,16 @@ HAVE_LIST=" | |||||
| # options emitted with CONFIG_ prefix but not available on command line | # options emitted with CONFIG_ prefix but not available on command line | ||||
| CONFIG_EXTRA=" | CONFIG_EXTRA=" | ||||
| aandct | |||||
| avutil | avutil | ||||
| golomb | |||||
| gplv3 | gplv3 | ||||
| h264chroma | |||||
| h264dsp | |||||
| h264pred | |||||
| huffman | |||||
| lgplv3 | lgplv3 | ||||
| lpc | |||||
| " | " | ||||
| CMDLINE_SELECT=" | CMDLINE_SELECT=" | ||||
| @@ -61,7 +61,8 @@ OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps.o \ | |||||
| OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ | OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ | ||||
| aacpsy.o aactab.o \ | aacpsy.o aactab.o \ | ||||
| psymodel.o iirfilter.o \ | psymodel.o iirfilter.o \ | ||||
| mpeg4audio.o kbdwin.o | |||||
| mpeg4audio.o kbdwin.o \ | |||||
| audio_frame_queue.o | |||||
| OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o | OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o | ||||
| OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o kbdwin.o | OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o kbdwin.o | ||||
| OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3enc.o ac3tab.o \ | OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3enc.o ac3tab.o \ | ||||
| @@ -314,7 +315,8 @@ OBJS-$(CONFIG_MSVIDEO1_ENCODER) += msvideo1enc.o elbg.o | |||||
| OBJS-$(CONFIG_MSZH_DECODER) += lcldec.o | OBJS-$(CONFIG_MSZH_DECODER) += lcldec.o | ||||
| OBJS-$(CONFIG_MXPEG_DECODER) += mxpegdec.o mjpegdec.o mjpeg.o | OBJS-$(CONFIG_MXPEG_DECODER) += mxpegdec.o mjpegdec.o mjpeg.o | ||||
| OBJS-$(CONFIG_NELLYMOSER_DECODER) += nellymoserdec.o nellymoser.o | OBJS-$(CONFIG_NELLYMOSER_DECODER) += nellymoserdec.o nellymoser.o | ||||
| OBJS-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.o nellymoser.o | |||||
| OBJS-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.o nellymoser.o \ | |||||
| audio_frame_queue.o | |||||
| OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o | OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o | ||||
| OBJS-$(CONFIG_PAM_DECODER) += pnmdec.o pnm.o | OBJS-$(CONFIG_PAM_DECODER) += pnmdec.o pnm.o | ||||
| OBJS-$(CONFIG_PAM_ENCODER) += pamenc.o pnm.o | OBJS-$(CONFIG_PAM_ENCODER) += pamenc.o pnm.o | ||||
| @@ -353,7 +355,8 @@ OBJS-$(CONFIG_R10K_ENCODER) += r210enc.o | |||||
| OBJS-$(CONFIG_R210_DECODER) += r210dec.o | OBJS-$(CONFIG_R210_DECODER) += r210dec.o | ||||
| OBJS-$(CONFIG_R210_ENCODER) += r210enc.o | OBJS-$(CONFIG_R210_ENCODER) += r210enc.o | ||||
| OBJS-$(CONFIG_RA_144_DECODER) += ra144dec.o ra144.o celp_filters.o | OBJS-$(CONFIG_RA_144_DECODER) += ra144dec.o ra144.o celp_filters.o | ||||
| OBJS-$(CONFIG_RA_144_ENCODER) += ra144enc.o ra144.o celp_filters.o | |||||
| OBJS-$(CONFIG_RA_144_ENCODER) += ra144enc.o ra144.o celp_filters.o \ | |||||
| audio_frame_queue.o | |||||
| OBJS-$(CONFIG_RA_288_DECODER) += ra288.o celp_math.o celp_filters.o | OBJS-$(CONFIG_RA_288_DECODER) += ra288.o celp_math.o celp_filters.o | ||||
| OBJS-$(CONFIG_RALF_DECODER) += ralf.o | OBJS-$(CONFIG_RALF_DECODER) += ralf.o | ||||
| OBJS-$(CONFIG_RAWVIDEO_DECODER) += rawdec.o | OBJS-$(CONFIG_RAWVIDEO_DECODER) += rawdec.o | ||||
| @@ -630,12 +633,13 @@ OBJS-$(CONFIG_WTV_DEMUXER) += mpeg4audio.o mpegaudiodata.o | |||||
| OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o | OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o | ||||
| OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o | OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o | ||||
| OBJS-$(CONFIG_LIBDIRAC_DECODER) += libdiracdec.o | OBJS-$(CONFIG_LIBDIRAC_DECODER) += libdiracdec.o | ||||
| OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o | |||||
| OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o audio_frame_queue.o | |||||
| OBJS-$(CONFIG_LIBGSM_DECODER) += libgsm.o | OBJS-$(CONFIG_LIBGSM_DECODER) += libgsm.o | ||||
| OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsm.o | OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsm.o | ||||
| OBJS-$(CONFIG_LIBGSM_MS_DECODER) += libgsm.o | OBJS-$(CONFIG_LIBGSM_MS_DECODER) += libgsm.o | ||||
| OBJS-$(CONFIG_LIBGSM_MS_ENCODER) += libgsm.o | OBJS-$(CONFIG_LIBGSM_MS_ENCODER) += libgsm.o | ||||
| OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o mpegaudiodecheader.o | |||||
| OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o mpegaudiodecheader.o \ | |||||
| audio_frame_queue.o | |||||
| OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER) += libopencore-amr.o | OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER) += libopencore-amr.o | ||||
| OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER) += libopencore-amr.o | OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER) += libopencore-amr.o | ||||
| OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER) += libopencore-amr.o | OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER) += libopencore-amr.o | ||||
| @@ -648,14 +652,15 @@ OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER) += libschroedingerenc.o \ | |||||
| libschroedinger.o \ | libschroedinger.o \ | ||||
| libdirac_libschro.o | libdirac_libschro.o | ||||
| OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o | OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o | ||||
| OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o | |||||
| OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o audio_frame_queue.o | |||||
| OBJS-$(CONFIG_LIBSTAGEFRIGHT_H264_DECODER)+= libstagefright.o | OBJS-$(CONFIG_LIBSTAGEFRIGHT_H264_DECODER)+= libstagefright.o | ||||
| OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o | OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o | ||||
| OBJS-$(CONFIG_LIBUTVIDEO_DECODER) += libutvideodec.o | OBJS-$(CONFIG_LIBUTVIDEO_DECODER) += libutvideodec.o | ||||
| OBJS-$(CONFIG_LIBUTVIDEO_ENCODER) += libutvideoenc.o | OBJS-$(CONFIG_LIBUTVIDEO_ENCODER) += libutvideoenc.o | ||||
| OBJS-$(CONFIG_LIBVO_AACENC_ENCODER) += libvo-aacenc.o mpeg4audio.o | OBJS-$(CONFIG_LIBVO_AACENC_ENCODER) += libvo-aacenc.o mpeg4audio.o | ||||
| OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o | OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o | ||||
| OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o vorbis_data.o | |||||
| OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o audio_frame_queue.o \ | |||||
| vorbis_data.o vorbis_parser.o | |||||
| OBJS-$(CONFIG_LIBVPX_DECODER) += libvpxdec.o | OBJS-$(CONFIG_LIBVPX_DECODER) += libvpxdec.o | ||||
| OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o | OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o | ||||
| OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o | OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o | ||||
| @@ -34,6 +34,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "internal.h" | |||||
| #include "mpeg4audio.h" | #include "mpeg4audio.h" | ||||
| #include "kbdwin.h" | #include "kbdwin.h" | ||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| @@ -476,8 +477,7 @@ static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, | |||||
| * Deinterleave input samples. | * Deinterleave input samples. | ||||
| * Channels are reordered from libavcodec's default order to AAC order. | * Channels are reordered from libavcodec's default order to AAC order. | ||||
| */ | */ | ||||
| static void deinterleave_input_samples(AACEncContext *s, | |||||
| const float *samples, int nb_samples) | |||||
| static void deinterleave_input_samples(AACEncContext *s, AVFrame *frame) | |||||
| { | { | ||||
| int ch, i; | int ch, i; | ||||
| const int sinc = s->channels; | const int sinc = s->channels; | ||||
| @@ -485,35 +485,43 @@ static void deinterleave_input_samples(AACEncContext *s, | |||||
| /* deinterleave and remap input samples */ | /* deinterleave and remap input samples */ | ||||
| for (ch = 0; ch < sinc; ch++) { | for (ch = 0; ch < sinc; ch++) { | ||||
| const float *sptr = samples + channel_map[ch]; | |||||
| /* copy last 1024 samples of previous frame to the start of the current frame */ | /* copy last 1024 samples of previous frame to the start of the current frame */ | ||||
| memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0])); | memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0])); | ||||
| /* deinterleave */ | /* deinterleave */ | ||||
| for (i = 2048; i < 2048 + nb_samples; i++) { | |||||
| s->planar_samples[ch][i] = *sptr; | |||||
| sptr += sinc; | |||||
| i = 2048; | |||||
| if (frame) { | |||||
| const float *sptr = ((const float *)frame->data[0]) + channel_map[ch]; | |||||
| for (; i < 2048 + frame->nb_samples; i++) { | |||||
| s->planar_samples[ch][i] = *sptr; | |||||
| sptr += sinc; | |||||
| } | |||||
| } | } | ||||
| memset(&s->planar_samples[ch][i], 0, | memset(&s->planar_samples[ch][i], 0, | ||||
| (3072 - i) * sizeof(s->planar_samples[0][0])); | (3072 - i) * sizeof(s->planar_samples[0][0])); | ||||
| } | } | ||||
| } | } | ||||
| static int aac_encode_frame(AVCodecContext *avctx, | |||||
| uint8_t *frame, int buf_size, void *data) | |||||
| static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| AACEncContext *s = avctx->priv_data; | AACEncContext *s = avctx->priv_data; | ||||
| float **samples = s->planar_samples, *samples2, *la, *overlap; | float **samples = s->planar_samples, *samples2, *la, *overlap; | ||||
| ChannelElement *cpe; | ChannelElement *cpe; | ||||
| int i, ch, w, g, chans, tag, start_ch; | |||||
| int i, ch, w, g, chans, tag, start_ch, ret; | |||||
| int chan_el_counter[4]; | int chan_el_counter[4]; | ||||
| FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; | FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; | ||||
| if (s->last_frame == 2) | if (s->last_frame == 2) | ||||
| return 0; | return 0; | ||||
| deinterleave_input_samples(s, data, data ? avctx->frame_size : 0); | |||||
| /* add current frame to queue */ | |||||
| if (frame) { | |||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } | |||||
| deinterleave_input_samples(s, frame); | |||||
| if (s->psypp) | if (s->psypp) | ||||
| ff_psy_preprocess(s->psypp, s->planar_samples, s->channels); | ff_psy_preprocess(s->psypp, s->planar_samples, s->channels); | ||||
| @@ -532,7 +540,7 @@ static int aac_encode_frame(AVCodecContext *avctx, | |||||
| overlap = &samples[cur_channel][0]; | overlap = &samples[cur_channel][0]; | ||||
| samples2 = overlap + 1024; | samples2 = overlap + 1024; | ||||
| la = samples2 + (448+64); | la = samples2 + (448+64); | ||||
| if (!data) | |||||
| if (!frame) | |||||
| la = NULL; | la = NULL; | ||||
| if (tag == TYPE_LFE) { | if (tag == TYPE_LFE) { | ||||
| wi[ch].window_type[0] = ONLY_LONG_SEQUENCE; | wi[ch].window_type[0] = ONLY_LONG_SEQUENCE; | ||||
| @@ -565,7 +573,13 @@ static int aac_encode_frame(AVCodecContext *avctx, | |||||
| } | } | ||||
| do { | do { | ||||
| int frame_bits; | int frame_bits; | ||||
| init_put_bits(&s->pb, frame, buf_size*8); | |||||
| if ((ret = ff_alloc_packet(avpkt, 768 * s->channels))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| init_put_bits(&s->pb, avpkt->data, avpkt->size); | |||||
| if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) | if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) | ||||
| put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | ||||
| start_ch = 0; | start_ch = 0; | ||||
| @@ -645,10 +659,15 @@ static int aac_encode_frame(AVCodecContext *avctx, | |||||
| s->lambda = FFMIN(s->lambda, 65536.f); | s->lambda = FFMIN(s->lambda, 65536.f); | ||||
| } | } | ||||
| if (!data) | |||||
| if (!frame) | |||||
| s->last_frame++; | s->last_frame++; | ||||
| return put_bits_count(&s->pb)>>3; | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = put_bits_count(&s->pb) >> 3; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| static av_cold int aac_encode_end(AVCodecContext *avctx) | static av_cold int aac_encode_end(AVCodecContext *avctx) | ||||
| @@ -662,6 +681,10 @@ static av_cold int aac_encode_end(AVCodecContext *avctx) | |||||
| ff_psy_preprocess_end(s->psypp); | ff_psy_preprocess_end(s->psypp); | ||||
| av_freep(&s->buffer.samples); | av_freep(&s->buffer.samples); | ||||
| av_freep(&s->cpe); | av_freep(&s->cpe); | ||||
| ff_af_queue_close(&s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | |||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -695,6 +718,11 @@ static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s) | |||||
| for(ch = 0; ch < s->channels; ch++) | for(ch = 0; ch < s->channels; ch++) | ||||
| s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch; | s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| if (!(avctx->coded_frame = avcodec_alloc_frame())) | |||||
| goto alloc_fail; | |||||
| #endif | |||||
| return 0; | return 0; | ||||
| alloc_fail: | alloc_fail: | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| @@ -756,6 +784,9 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) | |||||
| for (i = 0; i < 428; i++) | for (i = 0; i < 428; i++) | ||||
| ff_aac_pow34sf_tab[i] = sqrt(ff_aac_pow2sf_tab[i] * sqrt(ff_aac_pow2sf_tab[i])); | ff_aac_pow34sf_tab[i] = sqrt(ff_aac_pow2sf_tab[i] * sqrt(ff_aac_pow2sf_tab[i])); | ||||
| avctx->delay = 1024; | |||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| return 0; | return 0; | ||||
| fail: | fail: | ||||
| aac_encode_end(avctx); | aac_encode_end(avctx); | ||||
| @@ -785,7 +816,7 @@ AVCodec ff_aac_encoder = { | |||||
| .id = CODEC_ID_AAC, | .id = CODEC_ID_AAC, | ||||
| .priv_data_size = sizeof(AACEncContext), | .priv_data_size = sizeof(AACEncContext), | ||||
| .init = aac_encode_init, | .init = aac_encode_init, | ||||
| .encode = aac_encode_frame, | |||||
| .encode2 = aac_encode_frame, | |||||
| .close = aac_encode_end, | .close = aac_encode_end, | ||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -27,7 +27,7 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "aac.h" | #include "aac.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "psymodel.h" | #include "psymodel.h" | ||||
| #define AAC_CODER_NB 4 | #define AAC_CODER_NB 4 | ||||
| @@ -74,6 +74,7 @@ typedef struct AACEncContext { | |||||
| int cur_channel; | int cur_channel; | ||||
| int last_frame; | int last_frame; | ||||
| float lambda; | float lambda; | ||||
| AudioFrameQueue afq; | |||||
| DECLARE_ALIGNED(16, int, qcoefs)[96]; ///< quantized coefficients | DECLARE_ALIGNED(16, int, qcoefs)[96]; ///< quantized coefficients | ||||
| DECLARE_ALIGNED(32, float, scoefs)[1024]; ///< scaled coefficients | DECLARE_ALIGNED(32, float, scoefs)[1024]; ///< scaled coefficients | ||||
| @@ -2050,7 +2050,9 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx) | |||||
| s->mdct_end(s); | s->mdct_end(s); | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -2434,6 +2436,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) | |||||
| return ret; | return ret; | ||||
| avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks; | avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks; | ||||
| avctx->delay = AC3_BLOCK_SIZE; | |||||
| s->bitstream_mode = avctx->audio_service_type; | s->bitstream_mode = avctx->audio_service_type; | ||||
| if (s->bitstream_mode == AV_AUDIO_SERVICE_TYPE_KARAOKE) | if (s->bitstream_mode == AV_AUDIO_SERVICE_TYPE_KARAOKE) | ||||
| @@ -2479,9 +2482,13 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) | |||||
| if (ret) | if (ret) | ||||
| goto init_fail; | goto init_fail; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame= avcodec_alloc_frame(); | avctx->coded_frame= avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | |||||
| if (!avctx->coded_frame) { | |||||
| ret = AVERROR(ENOMEM); | |||||
| goto init_fail; | goto init_fail; | ||||
| } | |||||
| #endif | |||||
| ff_dsputil_init(&s->dsp, avctx); | ff_dsputil_init(&s->dsp, avctx); | ||||
| ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT); | ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT); | ||||
| @@ -297,9 +297,9 @@ int ff_ac3_float_mdct_init(AC3EncodeContext *s); | |||||
| int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s); | int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s); | ||||
| int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s); | int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s); | ||||
| int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, unsigned char *frame, | |||||
| int buf_size, void *data); | |||||
| int ff_ac3_float_encode_frame(AVCodecContext *avctx, unsigned char *frame, | |||||
| int buf_size, void *data); | |||||
| int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr); | |||||
| int ff_ac3_float_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr); | |||||
| #endif /* AVCODEC_AC3ENC_H */ | #endif /* AVCODEC_AC3ENC_H */ | ||||
| @@ -28,6 +28,7 @@ | |||||
| #define CONFIG_FFT_FLOAT 0 | #define CONFIG_FFT_FLOAT 0 | ||||
| #undef CONFIG_AC3ENC_FLOAT | #undef CONFIG_AC3ENC_FLOAT | ||||
| #include "internal.h" | |||||
| #include "ac3enc.h" | #include "ac3enc.h" | ||||
| #include "eac3enc.h" | #include "eac3enc.h" | ||||
| @@ -151,7 +152,7 @@ AVCodec ff_ac3_fixed_encoder = { | |||||
| .id = CODEC_ID_AC3, | .id = CODEC_ID_AC3, | ||||
| .priv_data_size = sizeof(AC3EncodeContext), | .priv_data_size = sizeof(AC3EncodeContext), | ||||
| .init = ac3_fixed_encode_init, | .init = ac3_fixed_encode_init, | ||||
| .encode = ff_ac3_fixed_encode_frame, | |||||
| .encode2 = ff_ac3_fixed_encode_frame, | |||||
| .close = ff_ac3_encode_close, | .close = ff_ac3_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), | .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), | ||||
| @@ -27,6 +27,7 @@ | |||||
| */ | */ | ||||
| #define CONFIG_AC3ENC_FLOAT 1 | #define CONFIG_AC3ENC_FLOAT 1 | ||||
| #include "internal.h" | |||||
| #include "ac3enc.h" | #include "ac3enc.h" | ||||
| #include "eac3enc.h" | #include "eac3enc.h" | ||||
| #include "kbdwin.h" | #include "kbdwin.h" | ||||
| @@ -149,7 +150,7 @@ AVCodec ff_ac3_encoder = { | |||||
| .id = CODEC_ID_AC3, | .id = CODEC_ID_AC3, | ||||
| .priv_data_size = sizeof(AC3EncodeContext), | .priv_data_size = sizeof(AC3EncodeContext), | ||||
| .init = ff_ac3_encode_init, | .init = ff_ac3_encode_init, | ||||
| .encode = ff_ac3_float_encode_frame, | |||||
| .encode2 = ff_ac3_float_encode_frame, | |||||
| .close = ff_ac3_encode_close, | .close = ff_ac3_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), | .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), | ||||
| @@ -386,11 +386,11 @@ static void compute_rematrixing_strategy(AC3EncodeContext *s) | |||||
| } | } | ||||
| int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame, | |||||
| int buf_size, void *data) | |||||
| int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| AC3EncodeContext *s = avctx->priv_data; | AC3EncodeContext *s = avctx->priv_data; | ||||
| const SampleType *samples = data; | |||||
| const SampleType *samples = (const SampleType *)frame->data[0]; | |||||
| int ret; | int ret; | ||||
| if (s->options.allow_per_frame_metadata) { | if (s->options.allow_per_frame_metadata) { | ||||
| @@ -437,7 +437,15 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame, | |||||
| ff_ac3_quantize_mantissas(s); | ff_ac3_quantize_mantissas(s); | ||||
| ff_ac3_output_frame(s, frame); | |||||
| if ((ret = ff_alloc_packet(avpkt, s->frame_size))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| ff_ac3_output_frame(s, avpkt->data); | |||||
| return s->frame_size; | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "adpcm.h" | #include "adpcm.h" | ||||
| #include "adpcm_data.h" | #include "adpcm_data.h" | ||||
| #include "internal.h" | |||||
| /** | /** | ||||
| * @file | * @file | ||||
| @@ -144,8 +145,10 @@ static av_cold int adpcm_encode_init(AVCodecContext *avctx) | |||||
| goto error; | goto error; | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| if (!(avctx->coded_frame = avcodec_alloc_frame())) | if (!(avctx->coded_frame = avcodec_alloc_frame())) | ||||
| goto error; | goto error; | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -156,7 +159,9 @@ error: | |||||
| static av_cold int adpcm_encode_close(AVCodecContext *avctx) | static av_cold int adpcm_encode_close(AVCodecContext *avctx) | ||||
| { | { | ||||
| ADPCMEncodeContext *s = avctx->priv_data; | ADPCMEncodeContext *s = avctx->priv_data; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&s->paths); | av_freep(&s->paths); | ||||
| av_freep(&s->node_buf); | av_freep(&s->node_buf); | ||||
| av_freep(&s->nodep_buf); | av_freep(&s->nodep_buf); | ||||
| @@ -473,23 +478,31 @@ static void adpcm_compress_trellis(AVCodecContext *avctx, | |||||
| c->idelta = nodes[0]->step; | c->idelta = nodes[0]->step; | ||||
| } | } | ||||
| static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| int buf_size, void *data) | |||||
| static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| int n, i, st; | |||||
| int16_t *samples; | |||||
| int n, i, st, pkt_size, ret; | |||||
| const int16_t *samples; | |||||
| uint8_t *dst; | uint8_t *dst; | ||||
| ADPCMEncodeContext *c = avctx->priv_data; | ADPCMEncodeContext *c = avctx->priv_data; | ||||
| uint8_t *buf; | uint8_t *buf; | ||||
| dst = frame; | |||||
| samples = data; | |||||
| samples = (const int16_t *)frame->data[0]; | |||||
| st = avctx->channels == 2; | st = avctx->channels == 2; | ||||
| /* n = (BLKSIZE - 4 * avctx->channels) / (2 * 8 * avctx->channels); */ | |||||
| if (avctx->codec_id == CODEC_ID_ADPCM_SWF) | |||||
| pkt_size = (2 + avctx->channels * (22 + 4 * (frame->nb_samples - 1)) + 7) / 8; | |||||
| else | |||||
| pkt_size = avctx->block_align; | |||||
| if ((ret = ff_alloc_packet(avpkt, pkt_size))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| dst = avpkt->data; | |||||
| switch(avctx->codec->id) { | switch(avctx->codec->id) { | ||||
| case CODEC_ID_ADPCM_IMA_WAV: | case CODEC_ID_ADPCM_IMA_WAV: | ||||
| n = avctx->frame_size / 8; | |||||
| n = frame->nb_samples / 8; | |||||
| c->status[0].prev_sample = samples[0]; | c->status[0].prev_sample = samples[0]; | ||||
| /* c->status[0].step_index = 0; | /* c->status[0].step_index = 0; | ||||
| XXX: not sure how to init the state machine */ | XXX: not sure how to init the state machine */ | ||||
| @@ -557,7 +570,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| { | { | ||||
| int ch, i; | int ch, i; | ||||
| PutBitContext pb; | PutBitContext pb; | ||||
| init_put_bits(&pb, dst, buf_size * 8); | |||||
| init_put_bits(&pb, dst, pkt_size * 8); | |||||
| for (ch = 0; ch < avctx->channels; ch++) { | for (ch = 0; ch < avctx->channels; ch++) { | ||||
| put_bits(&pb, 9, (c->status[ch].prev_sample + 0x10000) >> 7); | put_bits(&pb, 9, (c->status[ch].prev_sample + 0x10000) >> 7); | ||||
| @@ -581,16 +594,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| } | } | ||||
| flush_put_bits(&pb); | flush_put_bits(&pb); | ||||
| dst += put_bits_count(&pb) >> 3; | |||||
| break; | break; | ||||
| } | } | ||||
| case CODEC_ID_ADPCM_SWF: | case CODEC_ID_ADPCM_SWF: | ||||
| { | { | ||||
| int i; | int i; | ||||
| PutBitContext pb; | PutBitContext pb; | ||||
| init_put_bits(&pb, dst, buf_size * 8); | |||||
| init_put_bits(&pb, dst, pkt_size * 8); | |||||
| n = avctx->frame_size - 1; | |||||
| n = frame->nb_samples - 1; | |||||
| // store AdpcmCodeSize | // store AdpcmCodeSize | ||||
| put_bits(&pb, 2, 2); // set 4-bit flash adpcm format | put_bits(&pb, 2, 2); // set 4-bit flash adpcm format | ||||
| @@ -617,7 +629,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| } | } | ||||
| av_free(buf); | av_free(buf); | ||||
| } else { | } else { | ||||
| for (i = 1; i < avctx->frame_size; i++) { | |||||
| for (i = 1; i < frame->nb_samples; i++) { | |||||
| put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[0], | put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[0], | ||||
| samples[avctx->channels * i])); | samples[avctx->channels * i])); | ||||
| if (avctx->channels == 2) | if (avctx->channels == 2) | ||||
| @@ -626,7 +638,6 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| } | } | ||||
| } | } | ||||
| flush_put_bits(&pb); | flush_put_bits(&pb); | ||||
| dst += put_bits_count(&pb) >> 3; | |||||
| break; | break; | ||||
| } | } | ||||
| case CODEC_ID_ADPCM_MS: | case CODEC_ID_ADPCM_MS: | ||||
| @@ -674,7 +685,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| } | } | ||||
| break; | break; | ||||
| case CODEC_ID_ADPCM_YAMAHA: | case CODEC_ID_ADPCM_YAMAHA: | ||||
| n = avctx->frame_size / 2; | |||||
| n = frame->nb_samples / 2; | |||||
| if (avctx->trellis > 0) { | if (avctx->trellis > 0) { | ||||
| FF_ALLOC_OR_GOTO(avctx, buf, 2 * n * 2, error); | FF_ALLOC_OR_GOTO(avctx, buf, 2 * n * 2, error); | ||||
| n *= 2; | n *= 2; | ||||
| @@ -700,7 +711,10 @@ static int adpcm_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| default: | default: | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| return dst - frame; | |||||
| avpkt->size = pkt_size; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| error: | error: | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| } | } | ||||
| @@ -713,7 +727,7 @@ AVCodec ff_ ## name_ ## _encoder = { \ | |||||
| .id = id_, \ | .id = id_, \ | ||||
| .priv_data_size = sizeof(ADPCMEncodeContext), \ | .priv_data_size = sizeof(ADPCMEncodeContext), \ | ||||
| .init = adpcm_encode_init, \ | .init = adpcm_encode_init, \ | ||||
| .encode = adpcm_encode_frame, \ | |||||
| .encode2 = adpcm_encode_frame, \ | |||||
| .close = adpcm_encode_close, \ | .close = adpcm_encode_close, \ | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, \ | .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, \ | ||||
| AV_SAMPLE_FMT_NONE}, \ | AV_SAMPLE_FMT_NONE}, \ | ||||
| @@ -22,6 +22,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "adx.h" | #include "adx.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "internal.h" | |||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| /** | /** | ||||
| @@ -87,9 +88,6 @@ static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize) | |||||
| { | { | ||||
| ADXContext *c = avctx->priv_data; | ADXContext *c = avctx->priv_data; | ||||
| if (bufsize < HEADER_SIZE) | |||||
| return AVERROR(EINVAL); | |||||
| bytestream_put_be16(&buf, 0x8000); /* header signature */ | bytestream_put_be16(&buf, 0x8000); /* header signature */ | ||||
| bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */ | bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */ | ||||
| bytestream_put_byte(&buf, 3); /* encoding */ | bytestream_put_byte(&buf, 3); /* encoding */ | ||||
| @@ -119,9 +117,11 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| avctx->frame_size = BLOCK_SAMPLES; | avctx->frame_size = BLOCK_SAMPLES; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| #endif | |||||
| /* the cutoff can be adjusted, but this seems to work pretty well */ | /* the cutoff can be adjusted, but this seems to work pretty well */ | ||||
| c->cutoff = 500; | c->cutoff = 500; | ||||
| @@ -130,40 +130,38 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static av_cold int adx_encode_close(AVCodecContext *avctx) | |||||
| { | |||||
| av_freep(&avctx->coded_frame); | |||||
| return 0; | |||||
| } | |||||
| static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| int buf_size, void *data) | |||||
| static int adx_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| ADXContext *c = avctx->priv_data; | ADXContext *c = avctx->priv_data; | ||||
| const int16_t *samples = data; | |||||
| uint8_t *dst = frame; | |||||
| int ch; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| uint8_t *dst; | |||||
| int ch, out_size, ret; | |||||
| out_size = BLOCK_SIZE * avctx->channels + !c->header_parsed * HEADER_SIZE; | |||||
| if ((ret = ff_alloc_packet(avpkt, out_size)) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| dst = avpkt->data; | |||||
| if (!c->header_parsed) { | if (!c->header_parsed) { | ||||
| int hdrsize; | int hdrsize; | ||||
| if ((hdrsize = adx_encode_header(avctx, dst, buf_size)) < 0) { | |||||
| if ((hdrsize = adx_encode_header(avctx, dst, avpkt->size)) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); | av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| dst += hdrsize; | dst += hdrsize; | ||||
| buf_size -= hdrsize; | |||||
| c->header_parsed = 1; | c->header_parsed = 1; | ||||
| } | } | ||||
| if (buf_size < BLOCK_SIZE * avctx->channels) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| for (ch = 0; ch < avctx->channels; ch++) { | for (ch = 0; ch < avctx->channels; ch++) { | ||||
| adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels); | adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels); | ||||
| dst += BLOCK_SIZE; | dst += BLOCK_SIZE; | ||||
| } | } | ||||
| return dst - frame; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_adpcm_adx_encoder = { | AVCodec ff_adpcm_adx_encoder = { | ||||
| @@ -172,8 +170,7 @@ AVCodec ff_adpcm_adx_encoder = { | |||||
| .id = CODEC_ID_ADPCM_ADX, | .id = CODEC_ID_ADPCM_ADX, | ||||
| .priv_data_size = sizeof(ADXContext), | .priv_data_size = sizeof(ADXContext), | ||||
| .init = adx_encode_init, | .init = adx_encode_init, | ||||
| .encode = adx_encode_frame, | |||||
| .close = adx_encode_close, | |||||
| .encode2 = adx_encode_frame, | |||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, | .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, | ||||
| AV_SAMPLE_FMT_NONE }, | AV_SAMPLE_FMT_NONE }, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), | .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), | ||||
| @@ -0,0 +1,162 @@ | |||||
| /* | |||||
| * Audio Frame Queue | |||||
| * Copyright (c) 2012 Justin Ruggles | |||||
| * | |||||
| * 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 "libavutil/mathematics.h" | |||||
| #include "internal.h" | |||||
| #include "audio_frame_queue.h" | |||||
| void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq) | |||||
| { | |||||
| afq->avctx = avctx; | |||||
| afq->next_pts = AV_NOPTS_VALUE; | |||||
| afq->remaining_delay = avctx->delay; | |||||
| afq->remaining_samples = avctx->delay; | |||||
| afq->frame_queue = NULL; | |||||
| } | |||||
| static void delete_next_frame(AudioFrameQueue *afq) | |||||
| { | |||||
| AudioFrame *f = afq->frame_queue; | |||||
| if (f) { | |||||
| afq->frame_queue = f->next; | |||||
| f->next = NULL; | |||||
| av_freep(&f); | |||||
| } | |||||
| } | |||||
| void ff_af_queue_close(AudioFrameQueue *afq) | |||||
| { | |||||
| /* remove/free any remaining frames */ | |||||
| while (afq->frame_queue) | |||||
| delete_next_frame(afq); | |||||
| memset(afq, 0, sizeof(*afq)); | |||||
| } | |||||
| int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f) | |||||
| { | |||||
| AudioFrame *new_frame; | |||||
| AudioFrame *queue_end = afq->frame_queue; | |||||
| /* find the end of the queue */ | |||||
| while (queue_end && queue_end->next) | |||||
| queue_end = queue_end->next; | |||||
| /* allocate new frame queue entry */ | |||||
| if (!(new_frame = av_malloc(sizeof(*new_frame)))) | |||||
| return AVERROR(ENOMEM); | |||||
| /* get frame parameters */ | |||||
| new_frame->next = NULL; | |||||
| new_frame->duration = f->nb_samples; | |||||
| if (f->pts != AV_NOPTS_VALUE) { | |||||
| new_frame->pts = av_rescale_q(f->pts, | |||||
| afq->avctx->time_base, | |||||
| (AVRational){ 1, afq->avctx->sample_rate }); | |||||
| afq->next_pts = new_frame->pts + new_frame->duration; | |||||
| } else { | |||||
| new_frame->pts = AV_NOPTS_VALUE; | |||||
| afq->next_pts = AV_NOPTS_VALUE; | |||||
| } | |||||
| /* add new frame to the end of the queue */ | |||||
| if (!queue_end) | |||||
| afq->frame_queue = new_frame; | |||||
| else | |||||
| queue_end->next = new_frame; | |||||
| /* add frame sample count */ | |||||
| afq->remaining_samples += f->nb_samples; | |||||
| #ifdef DEBUG | |||||
| ff_af_queue_log_state(afq); | |||||
| #endif | |||||
| return 0; | |||||
| } | |||||
| void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, | |||||
| int *duration) | |||||
| { | |||||
| int64_t out_pts = AV_NOPTS_VALUE; | |||||
| int removed_samples = 0; | |||||
| #ifdef DEBUG | |||||
| ff_af_queue_log_state(afq); | |||||
| #endif | |||||
| /* get output pts from the next frame or generated pts */ | |||||
| if (afq->frame_queue) { | |||||
| if (afq->frame_queue->pts != AV_NOPTS_VALUE) | |||||
| out_pts = afq->frame_queue->pts - afq->remaining_delay; | |||||
| } else { | |||||
| if (afq->next_pts != AV_NOPTS_VALUE) | |||||
| out_pts = afq->next_pts - afq->remaining_delay; | |||||
| } | |||||
| if (pts) { | |||||
| if (out_pts != AV_NOPTS_VALUE) | |||||
| *pts = ff_samples_to_time_base(afq->avctx, out_pts); | |||||
| else | |||||
| *pts = AV_NOPTS_VALUE; | |||||
| } | |||||
| /* if the delay is larger than the packet duration, we use up delay samples | |||||
| for the output packet and leave all frames in the queue */ | |||||
| if (afq->remaining_delay >= nb_samples) { | |||||
| removed_samples += nb_samples; | |||||
| afq->remaining_delay -= nb_samples; | |||||
| } | |||||
| /* remove frames from the queue until we have enough to cover the | |||||
| requested number of samples or until the queue is empty */ | |||||
| while (removed_samples < nb_samples && afq->frame_queue) { | |||||
| removed_samples += afq->frame_queue->duration; | |||||
| delete_next_frame(afq); | |||||
| } | |||||
| afq->remaining_samples -= removed_samples; | |||||
| /* if there are no frames left and we have room for more samples, use | |||||
| any remaining delay samples */ | |||||
| if (removed_samples < nb_samples && afq->remaining_samples > 0) { | |||||
| int add_samples = FFMIN(afq->remaining_samples, | |||||
| nb_samples - removed_samples); | |||||
| removed_samples += add_samples; | |||||
| afq->remaining_samples -= add_samples; | |||||
| } | |||||
| if (removed_samples > nb_samples) | |||||
| av_log(afq->avctx, AV_LOG_WARNING, "frame_size is too large\n"); | |||||
| if (duration) | |||||
| *duration = ff_samples_to_time_base(afq->avctx, removed_samples); | |||||
| } | |||||
| void ff_af_queue_log_state(AudioFrameQueue *afq) | |||||
| { | |||||
| AudioFrame *f; | |||||
| av_log(afq->avctx, AV_LOG_DEBUG, "remaining delay = %d\n", | |||||
| afq->remaining_delay); | |||||
| av_log(afq->avctx, AV_LOG_DEBUG, "remaining samples = %d\n", | |||||
| afq->remaining_samples); | |||||
| av_log(afq->avctx, AV_LOG_DEBUG, "frames:\n"); | |||||
| f = afq->frame_queue; | |||||
| while (f) { | |||||
| av_log(afq->avctx, AV_LOG_DEBUG, " [ pts=%9"PRId64" duration=%d ]\n", | |||||
| f->pts, f->duration); | |||||
| f = f->next; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,90 @@ | |||||
| /* | |||||
| * Audio Frame Queue | |||||
| * Copyright (c) 2012 Justin Ruggles | |||||
| * | |||||
| * 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 | |||||
| */ | |||||
| #ifndef AVCODEC_AUDIO_FRAME_QUEUE_H | |||||
| #define AVCODEC_AUDIO_FRAME_QUEUE_H | |||||
| #include "avcodec.h" | |||||
| typedef struct AudioFrame { | |||||
| int64_t pts; | |||||
| int duration; | |||||
| struct AudioFrame *next; | |||||
| } AudioFrame; | |||||
| typedef struct AudioFrameQueue { | |||||
| AVCodecContext *avctx; | |||||
| int64_t next_pts; | |||||
| int remaining_delay; | |||||
| int remaining_samples; | |||||
| AudioFrame *frame_queue; | |||||
| } AudioFrameQueue; | |||||
| /** | |||||
| * Initialize AudioFrameQueue. | |||||
| * | |||||
| * @param avctx context to use for time_base and av_log | |||||
| * @param afq queue context | |||||
| */ | |||||
| void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq); | |||||
| /** | |||||
| * Close AudioFrameQueue. | |||||
| * | |||||
| * Frees memory if needed. | |||||
| * | |||||
| * @param afq queue context | |||||
| */ | |||||
| void ff_af_queue_close(AudioFrameQueue *afq); | |||||
| /** | |||||
| * Add a frame to the queue. | |||||
| * | |||||
| * @param afq queue context | |||||
| * @param f frame to add to the queue | |||||
| */ | |||||
| int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f); | |||||
| /** | |||||
| * Remove frame(s) from the queue. | |||||
| * | |||||
| * Retrieves the pts of the next available frame, or a generated pts based on | |||||
| * the last frame duration if there are no frames left in the queue. The number | |||||
| * of requested samples should be the full number of samples represented by the | |||||
| * packet that will be output by the encoder. If fewer samples are available | |||||
| * in the queue, a smaller value will be used for the output duration. | |||||
| * | |||||
| * @param afq queue context | |||||
| * @param nb_samples number of samples to remove from the queue | |||||
| * @param[out] pts output packet pts | |||||
| * @param[out] duration output packet duration | |||||
| */ | |||||
| void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, | |||||
| int *duration); | |||||
| /** | |||||
| * Log the current state of the queue. | |||||
| * | |||||
| * @param afq queue context | |||||
| */ | |||||
| void ff_af_queue_log_state(AudioFrameQueue *afq); | |||||
| #endif /* AVCODEC_AUDIO_FRAME_QUEUE_H */ | |||||
| @@ -252,7 +252,7 @@ AVCodec ff_eac3_encoder = { | |||||
| .id = CODEC_ID_EAC3, | .id = CODEC_ID_EAC3, | ||||
| .priv_data_size = sizeof(AC3EncodeContext), | .priv_data_size = sizeof(AC3EncodeContext), | ||||
| .init = ff_ac3_encode_init, | .init = ff_ac3_encode_init, | ||||
| .encode = ff_ac3_float_encode_frame, | |||||
| .encode2 = ff_ac3_float_encode_frame, | |||||
| .close = ff_ac3_encode_close, | .close = ff_ac3_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"), | .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"), | ||||
| @@ -25,6 +25,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "golomb.h" | #include "golomb.h" | ||||
| #include "internal.h" | |||||
| #include "lpc.h" | #include "lpc.h" | ||||
| #include "flac.h" | #include "flac.h" | ||||
| #include "flacdata.h" | #include "flacdata.h" | ||||
| @@ -367,9 +368,11 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) | |||||
| s->frame_count = 0; | s->frame_count = 0; | ||||
| s->min_framesize = s->max_framesize; | s->min_framesize = s->max_framesize; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| #endif | |||||
| if (channels == 3 && | if (channels == 3 && | ||||
| avctx->channel_layout != (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) || | avctx->channel_layout != (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) || | ||||
| @@ -402,7 +405,7 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| static void init_frame(FlacEncodeContext *s) | |||||
| static void init_frame(FlacEncodeContext *s, int nb_samples) | |||||
| { | { | ||||
| int i, ch; | int i, ch; | ||||
| FlacFrame *frame; | FlacFrame *frame; | ||||
| @@ -410,7 +413,7 @@ static void init_frame(FlacEncodeContext *s) | |||||
| frame = &s->frame; | frame = &s->frame; | ||||
| for (i = 0; i < 16; i++) { | for (i = 0; i < 16; i++) { | ||||
| if (s->avctx->frame_size == ff_flac_blocksize_table[i]) { | |||||
| if (nb_samples == ff_flac_blocksize_table[i]) { | |||||
| frame->blocksize = ff_flac_blocksize_table[i]; | frame->blocksize = ff_flac_blocksize_table[i]; | ||||
| frame->bs_code[0] = i; | frame->bs_code[0] = i; | ||||
| frame->bs_code[1] = 0; | frame->bs_code[1] = 0; | ||||
| @@ -418,7 +421,7 @@ static void init_frame(FlacEncodeContext *s) | |||||
| } | } | ||||
| } | } | ||||
| if (i == 16) { | if (i == 16) { | ||||
| frame->blocksize = s->avctx->frame_size; | |||||
| frame->blocksize = nb_samples; | |||||
| if (frame->blocksize <= 256) { | if (frame->blocksize <= 256) { | ||||
| frame->bs_code[0] = 6; | frame->bs_code[0] = 6; | ||||
| frame->bs_code[1] = frame->blocksize-1; | frame->bs_code[1] = frame->blocksize-1; | ||||
| @@ -1188,9 +1191,9 @@ static void write_frame_footer(FlacEncodeContext *s) | |||||
| } | } | ||||
| static int write_frame(FlacEncodeContext *s, uint8_t *frame, int buf_size) | |||||
| static int write_frame(FlacEncodeContext *s, AVPacket *avpkt) | |||||
| { | { | ||||
| init_put_bits(&s->pb, frame, buf_size); | |||||
| init_put_bits(&s->pb, avpkt->data, avpkt->size); | |||||
| write_frame_header(s); | write_frame_header(s); | ||||
| write_subframes(s); | write_subframes(s); | ||||
| write_frame_footer(s); | write_frame_footer(s); | ||||
| @@ -1212,30 +1215,31 @@ static void update_md5_sum(FlacEncodeContext *s, const int16_t *samples) | |||||
| } | } | ||||
| static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| int buf_size, void *data) | |||||
| static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| FlacEncodeContext *s; | FlacEncodeContext *s; | ||||
| const int16_t *samples = data; | |||||
| int frame_bytes, out_bytes; | |||||
| const int16_t *samples; | |||||
| int frame_bytes, out_bytes, ret; | |||||
| s = avctx->priv_data; | s = avctx->priv_data; | ||||
| /* when the last block is reached, update the header in extradata */ | /* when the last block is reached, update the header in extradata */ | ||||
| if (!data) { | |||||
| if (!frame) { | |||||
| s->max_framesize = s->max_encoded_framesize; | s->max_framesize = s->max_encoded_framesize; | ||||
| av_md5_final(s->md5ctx, s->md5sum); | av_md5_final(s->md5ctx, s->md5sum); | ||||
| write_streaminfo(s, avctx->extradata); | write_streaminfo(s, avctx->extradata); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| samples = (const int16_t *)frame->data[0]; | |||||
| /* change max_framesize for small final frame */ | /* change max_framesize for small final frame */ | ||||
| if (avctx->frame_size < s->frame.blocksize) { | |||||
| s->max_framesize = ff_flac_get_max_frame_size(avctx->frame_size, | |||||
| if (frame->nb_samples < s->frame.blocksize) { | |||||
| s->max_framesize = ff_flac_get_max_frame_size(frame->nb_samples, | |||||
| s->channels, 16); | s->channels, 16); | ||||
| } | } | ||||
| init_frame(s); | |||||
| init_frame(s, frame->nb_samples); | |||||
| copy_samples(s, samples); | copy_samples(s, samples); | ||||
| @@ -1250,22 +1254,26 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| frame_bytes = encode_frame(s); | frame_bytes = encode_frame(s); | ||||
| } | } | ||||
| if (buf_size < frame_bytes) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); | |||||
| return 0; | |||||
| if ((ret = ff_alloc_packet(avpkt, frame_bytes))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | } | ||||
| out_bytes = write_frame(s, frame, buf_size); | |||||
| out_bytes = write_frame(s, avpkt); | |||||
| s->frame_count++; | s->frame_count++; | ||||
| avctx->coded_frame->pts = s->sample_count; | |||||
| s->sample_count += avctx->frame_size; | |||||
| s->sample_count += frame->nb_samples; | |||||
| update_md5_sum(s, samples); | update_md5_sum(s, samples); | ||||
| if (out_bytes > s->max_encoded_framesize) | if (out_bytes > s->max_encoded_framesize) | ||||
| s->max_encoded_framesize = out_bytes; | s->max_encoded_framesize = out_bytes; | ||||
| if (out_bytes < s->min_framesize) | if (out_bytes < s->min_framesize) | ||||
| s->min_framesize = out_bytes; | s->min_framesize = out_bytes; | ||||
| return out_bytes; | |||||
| avpkt->pts = frame->pts; | |||||
| avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples); | |||||
| avpkt->size = out_bytes; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| @@ -1278,7 +1286,9 @@ static av_cold int flac_encode_close(AVCodecContext *avctx) | |||||
| } | } | ||||
| av_freep(&avctx->extradata); | av_freep(&avctx->extradata); | ||||
| avctx->extradata_size = 0; | avctx->extradata_size = 0; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -1316,7 +1326,7 @@ AVCodec ff_flac_encoder = { | |||||
| .id = CODEC_ID_FLAC, | .id = CODEC_ID_FLAC, | ||||
| .priv_data_size = sizeof(FlacEncodeContext), | .priv_data_size = sizeof(FlacEncodeContext), | ||||
| .init = flac_encode_init, | .init = flac_encode_init, | ||||
| .encode = flac_encode_frame, | |||||
| .encode2 = flac_encode_frame, | |||||
| .close = flac_encode_close, | .close = flac_encode_close, | ||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_LOSSLESS, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_LOSSLESS, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -28,6 +28,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | |||||
| #include "g722.h" | #include "g722.h" | ||||
| #define FREEZE_INTERVAL 128 | #define FREEZE_INTERVAL 128 | ||||
| @@ -50,6 +51,9 @@ static av_cold int g722_encode_close(AVCodecContext *avctx) | |||||
| av_freep(&c->node_buf[i]); | av_freep(&c->node_buf[i]); | ||||
| av_freep(&c->nodep_buf[i]); | av_freep(&c->nodep_buf[i]); | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | |||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -104,6 +108,7 @@ static av_cold int g722_encode_init(AVCodecContext * avctx) | |||||
| a common packet size for VoIP applications */ | a common packet size for VoIP applications */ | ||||
| avctx->frame_size = 320; | avctx->frame_size = 320; | ||||
| } | } | ||||
| avctx->delay = 22; | |||||
| if (avctx->trellis) { | if (avctx->trellis) { | ||||
| /* validate trellis */ | /* validate trellis */ | ||||
| @@ -116,6 +121,14 @@ static av_cold int g722_encode_init(AVCodecContext * avctx) | |||||
| } | } | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | |||||
| if (!avctx->coded_frame) { | |||||
| ret = AVERROR(ENOMEM); | |||||
| goto error; | |||||
| } | |||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| g722_encode_close(avctx); | g722_encode_close(avctx); | ||||
| @@ -345,27 +358,36 @@ static void g722_encode_no_trellis(G722Context *c, | |||||
| encode_byte(c, dst++, &samples[i]); | encode_byte(c, dst++, &samples[i]); | ||||
| } | } | ||||
| static int g722_encode_frame(AVCodecContext *avctx, | |||||
| uint8_t *dst, int buf_size, void *data) | |||||
| static int g722_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| G722Context *c = avctx->priv_data; | G722Context *c = avctx->priv_data; | ||||
| const int16_t *samples = data; | |||||
| int nb_samples; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| int nb_samples, out_size, ret; | |||||
| nb_samples = avctx->frame_size - (avctx->frame_size & 1); | |||||
| out_size = (frame->nb_samples + 1) / 2; | |||||
| if ((ret = ff_alloc_packet(avpkt, out_size))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| nb_samples = frame->nb_samples - (frame->nb_samples & 1); | |||||
| if (avctx->trellis) | if (avctx->trellis) | ||||
| g722_encode_trellis(c, avctx->trellis, dst, nb_samples, samples); | |||||
| g722_encode_trellis(c, avctx->trellis, avpkt->data, nb_samples, samples); | |||||
| else | else | ||||
| g722_encode_no_trellis(c, dst, nb_samples, samples); | |||||
| g722_encode_no_trellis(c, avpkt->data, nb_samples, samples); | |||||
| /* handle last frame with odd frame_size */ | /* handle last frame with odd frame_size */ | ||||
| if (nb_samples < avctx->frame_size) { | |||||
| if (nb_samples < frame->nb_samples) { | |||||
| int16_t last_samples[2] = { samples[nb_samples], samples[nb_samples] }; | int16_t last_samples[2] = { samples[nb_samples], samples[nb_samples] }; | ||||
| encode_byte(c, &dst[nb_samples >> 1], last_samples); | |||||
| encode_byte(c, &avpkt->data[nb_samples >> 1], last_samples); | |||||
| } | } | ||||
| return (avctx->frame_size + 1) >> 1; | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_adpcm_g722_encoder = { | AVCodec ff_adpcm_g722_encoder = { | ||||
| @@ -375,7 +397,7 @@ AVCodec ff_adpcm_g722_encoder = { | |||||
| .priv_data_size = sizeof(G722Context), | .priv_data_size = sizeof(G722Context), | ||||
| .init = g722_encode_init, | .init = g722_encode_init, | ||||
| .close = g722_encode_close, | .close = g722_encode_close, | ||||
| .encode = g722_encode_frame, | |||||
| .encode2 = g722_encode_frame, | |||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"), | .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -330,10 +330,12 @@ static av_cold int g726_encode_init(AVCodecContext *avctx) | |||||
| g726_reset(c); | g726_reset(c); | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| avctx->coded_frame->key_frame = 1; | avctx->coded_frame->key_frame = 1; | ||||
| #endif | |||||
| /* select a frame size that will end on a byte boundary and have a size of | /* select a frame size that will end on a byte boundary and have a size of | ||||
| approximately 1024 bytes */ | approximately 1024 bytes */ | ||||
| @@ -342,28 +344,37 @@ static av_cold int g726_encode_init(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| static av_cold int g726_encode_close(AVCodecContext *avctx) | static av_cold int g726_encode_close(AVCodecContext *avctx) | ||||
| { | { | ||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | |||||
| static int g726_encode_frame(AVCodecContext *avctx, | |||||
| uint8_t *dst, int buf_size, void *data) | |||||
| static int g726_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| G726Context *c = avctx->priv_data; | G726Context *c = avctx->priv_data; | ||||
| const int16_t *samples = data; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| PutBitContext pb; | PutBitContext pb; | ||||
| int i; | |||||
| int i, ret, out_size; | |||||
| init_put_bits(&pb, dst, 1024*1024); | |||||
| out_size = (frame->nb_samples * c->code_size + 7) / 8; | |||||
| if ((ret = ff_alloc_packet(avpkt, out_size))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| init_put_bits(&pb, avpkt->data, avpkt->size); | |||||
| for (i = 0; i < avctx->frame_size; i++) | |||||
| for (i = 0; i < frame->nb_samples; i++) | |||||
| put_bits(&pb, c->code_size, g726_encode(c, *samples++)); | put_bits(&pb, c->code_size, g726_encode(c, *samples++)); | ||||
| flush_put_bits(&pb); | flush_put_bits(&pb); | ||||
| return put_bits_count(&pb)>>3; | |||||
| avpkt->size = out_size; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| #define OFFSET(x) offsetof(G726Context, x) | #define OFFSET(x) offsetof(G726Context, x) | ||||
| @@ -391,8 +402,10 @@ AVCodec ff_adpcm_g726_encoder = { | |||||
| .id = CODEC_ID_ADPCM_G726, | .id = CODEC_ID_ADPCM_G726, | ||||
| .priv_data_size = sizeof(G726Context), | .priv_data_size = sizeof(G726Context), | ||||
| .init = g726_encode_init, | .init = g726_encode_init, | ||||
| .encode = g726_encode_frame, | |||||
| .encode2 = g726_encode_frame, | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| .close = g726_encode_close, | .close = g726_encode_close, | ||||
| #endif | |||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"), | .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"), | ||||
| @@ -372,7 +372,8 @@ static int decode_band_hdr(IVI4DecContext *ctx, IVIBandDesc *band, | |||||
| if (!get_bits1(&ctx->gb) || ctx->frame_type == FRAMETYPE_INTRA) { | if (!get_bits1(&ctx->gb) || ctx->frame_type == FRAMETYPE_INTRA) { | ||||
| transform_id = get_bits(&ctx->gb, 5); | transform_id = get_bits(&ctx->gb, 5); | ||||
| if (!transforms[transform_id].inv_trans) { | |||||
| if (transform_id >= FF_ARRAY_ELEMS(transforms) || | |||||
| !transforms[transform_id].inv_trans) { | |||||
| av_log_ask_for_sample(avctx, "Unimplemented transform: %d!\n", transform_id); | av_log_ask_for_sample(avctx, "Unimplemented transform: %d!\n", transform_id); | ||||
| return AVERROR_PATCHWELCOME; | return AVERROR_PATCHWELCOME; | ||||
| } | } | ||||
| @@ -24,11 +24,19 @@ | |||||
| * Interface to libfaac for aac encoding. | * Interface to libfaac for aac encoding. | ||||
| */ | */ | ||||
| #include "avcodec.h" | |||||
| #include <faac.h> | #include <faac.h> | ||||
| #include "avcodec.h" | |||||
| #include "audio_frame_queue.h" | |||||
| #include "internal.h" | |||||
| /* libfaac has an encoder delay of 1024 samples */ | |||||
| #define FAAC_DELAY_SAMPLES 1024 | |||||
| typedef struct FaacAudioContext { | typedef struct FaacAudioContext { | ||||
| faacEncHandle faac_handle; | faacEncHandle faac_handle; | ||||
| AudioFrameQueue afq; | |||||
| } FaacAudioContext; | } FaacAudioContext; | ||||
| static const int channel_maps[][6] = { | static const int channel_maps[][6] = { | ||||
| @@ -42,11 +50,15 @@ static av_cold int Faac_encode_close(AVCodecContext *avctx) | |||||
| { | { | ||||
| FaacAudioContext *s = avctx->priv_data; | FaacAudioContext *s = avctx->priv_data; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&avctx->extradata); | av_freep(&avctx->extradata); | ||||
| ff_af_queue_close(&s->afq); | |||||
| if (s->faac_handle) | if (s->faac_handle) | ||||
| faacEncClose(s->faac_handle); | faacEncClose(s->faac_handle); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -118,11 +130,13 @@ static av_cold int Faac_encode_init(AVCodecContext *avctx) | |||||
| avctx->frame_size = samples_input / avctx->channels; | avctx->frame_size = samples_input / avctx->channels; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame= avcodec_alloc_frame(); | avctx->coded_frame= avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| /* Set decoder specific info */ | /* Set decoder specific info */ | ||||
| avctx->extradata_size = 0; | avctx->extradata_size = 0; | ||||
| @@ -153,26 +167,52 @@ static av_cold int Faac_encode_init(AVCodecContext *avctx) | |||||
| goto error; | goto error; | ||||
| } | } | ||||
| avctx->delay = FAAC_DELAY_SAMPLES; | |||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| Faac_encode_close(avctx); | Faac_encode_close(avctx); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| static int Faac_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame, int buf_size, void *data) | |||||
| static int Faac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| FaacAudioContext *s = avctx->priv_data; | FaacAudioContext *s = avctx->priv_data; | ||||
| int bytes_written; | |||||
| int num_samples = data ? avctx->frame_size : 0; | |||||
| int bytes_written, ret; | |||||
| int num_samples = frame ? frame->nb_samples : 0; | |||||
| void *samples = frame ? frame->data[0] : NULL; | |||||
| bytes_written = faacEncEncode(s->faac_handle, | |||||
| data, | |||||
| if ((ret = ff_alloc_packet(avpkt, (7 + 768) * avctx->channels))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| bytes_written = faacEncEncode(s->faac_handle, samples, | |||||
| num_samples * avctx->channels, | num_samples * avctx->channels, | ||||
| frame, | |||||
| buf_size); | |||||
| avpkt->data, avpkt->size); | |||||
| if (bytes_written < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "faacEncEncode() error\n"); | |||||
| return bytes_written; | |||||
| } | |||||
| /* add current frame to the queue */ | |||||
| if (frame) { | |||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } | |||||
| return bytes_written; | |||||
| if (!bytes_written) | |||||
| return 0; | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = bytes_written; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| static const AVProfile profiles[] = { | static const AVProfile profiles[] = { | ||||
| @@ -189,7 +229,7 @@ AVCodec ff_libfaac_encoder = { | |||||
| .id = CODEC_ID_AAC, | .id = CODEC_ID_AAC, | ||||
| .priv_data_size = sizeof(FaacAudioContext), | .priv_data_size = sizeof(FaacAudioContext), | ||||
| .init = Faac_encode_init, | .init = Faac_encode_init, | ||||
| .encode = Faac_encode_frame, | |||||
| .encode2 = Faac_encode_frame, | |||||
| .close = Faac_encode_close, | .close = Faac_encode_close, | ||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -30,10 +30,13 @@ | |||||
| #include <gsm/gsm.h> | #include <gsm/gsm.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | |||||
| #include "gsm.h" | #include "gsm.h" | ||||
| static av_cold int libgsm_encode_close(AVCodecContext *avctx) { | static av_cold int libgsm_encode_close(AVCodecContext *avctx) { | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| gsm_destroy(avctx->priv_data); | gsm_destroy(avctx->priv_data); | ||||
| avctx->priv_data = NULL; | avctx->priv_data = NULL; | ||||
| return 0; | return 0; | ||||
| @@ -78,9 +81,11 @@ static av_cold int libgsm_encode_init(AVCodecContext *avctx) { | |||||
| } | } | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame= avcodec_alloc_frame(); | avctx->coded_frame= avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| goto error; | goto error; | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -88,20 +93,29 @@ error: | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| static int libgsm_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame, int buf_size, void *data) { | |||||
| // we need a full block | |||||
| if(buf_size < avctx->block_align) return 0; | |||||
| static int libgsm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | |||||
| int ret; | |||||
| gsm_signal *samples = (gsm_signal *)frame->data[0]; | |||||
| struct gsm_state *state = avctx->priv_data; | |||||
| if ((ret = ff_alloc_packet(avpkt, avctx->block_align))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| switch(avctx->codec_id) { | switch(avctx->codec_id) { | ||||
| case CODEC_ID_GSM: | case CODEC_ID_GSM: | ||||
| gsm_encode(avctx->priv_data,data,frame); | |||||
| gsm_encode(state, samples, avpkt->data); | |||||
| break; | break; | ||||
| case CODEC_ID_GSM_MS: | case CODEC_ID_GSM_MS: | ||||
| gsm_encode(avctx->priv_data,data,frame); | |||||
| gsm_encode(avctx->priv_data,((short*)data)+GSM_FRAME_SIZE,frame+32); | |||||
| gsm_encode(state, samples, avpkt->data); | |||||
| gsm_encode(state, samples + GSM_FRAME_SIZE, avpkt->data + 32); | |||||
| } | } | ||||
| return avctx->block_align; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| @@ -110,7 +124,7 @@ AVCodec ff_libgsm_encoder = { | |||||
| .type = AVMEDIA_TYPE_AUDIO, | .type = AVMEDIA_TYPE_AUDIO, | ||||
| .id = CODEC_ID_GSM, | .id = CODEC_ID_GSM, | ||||
| .init = libgsm_encode_init, | .init = libgsm_encode_init, | ||||
| .encode = libgsm_encode_frame, | |||||
| .encode2 = libgsm_encode_frame, | |||||
| .close = libgsm_encode_close, | .close = libgsm_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"), | .long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"), | ||||
| @@ -121,7 +135,7 @@ AVCodec ff_libgsm_ms_encoder = { | |||||
| .type = AVMEDIA_TYPE_AUDIO, | .type = AVMEDIA_TYPE_AUDIO, | ||||
| .id = CODEC_ID_GSM_MS, | .id = CODEC_ID_GSM_MS, | ||||
| .init = libgsm_encode_init, | .init = libgsm_encode_init, | ||||
| .encode = libgsm_encode_frame, | |||||
| .encode2 = libgsm_encode_frame, | |||||
| .close = libgsm_encode_close, | .close = libgsm_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"), | .long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"), | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "libavutil/log.h" | #include "libavutil/log.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "mpegaudio.h" | #include "mpegaudio.h" | ||||
| #include "mpegaudiodecheader.h" | #include "mpegaudiodecheader.h" | ||||
| @@ -44,6 +45,7 @@ typedef struct LAMEContext { | |||||
| int buffer_index; | int buffer_index; | ||||
| int reservoir; | int reservoir; | ||||
| void *planar_samples[2]; | void *planar_samples[2]; | ||||
| AudioFrameQueue afq; | |||||
| } LAMEContext; | } LAMEContext; | ||||
| @@ -51,10 +53,14 @@ static av_cold int mp3lame_encode_close(AVCodecContext *avctx) | |||||
| { | { | ||||
| LAMEContext *s = avctx->priv_data; | LAMEContext *s = avctx->priv_data; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&s->planar_samples[0]); | av_freep(&s->planar_samples[0]); | ||||
| av_freep(&s->planar_samples[1]); | av_freep(&s->planar_samples[1]); | ||||
| ff_af_queue_close(&s->afq); | |||||
| lame_close(s->gfp); | lame_close(s->gfp); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -111,12 +117,19 @@ static av_cold int mp3lame_encode_init(AVCodecContext *avctx) | |||||
| goto error; | goto error; | ||||
| } | } | ||||
| /* get encoder delay */ | |||||
| avctx->delay = lame_get_encoder_delay(s->gfp) + 528 + 1; | |||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| avctx->frame_size = lame_get_framesize(s->gfp); | avctx->frame_size = lame_get_framesize(s->gfp); | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| /* sample format */ | /* sample format */ | ||||
| if (avctx->sample_fmt == AV_SAMPLE_FMT_S32 || | if (avctx->sample_fmt == AV_SAMPLE_FMT_S32 || | ||||
| @@ -144,67 +157,67 @@ error: | |||||
| const type *input = samples; \ | const type *input = samples; \ | ||||
| type *output = s->planar_samples[ch]; \ | type *output = s->planar_samples[ch]; \ | ||||
| input += ch; \ | input += ch; \ | ||||
| for (i = 0; i < s->avctx->frame_size; i++) { \ | |||||
| for (i = 0; i < nb_samples; i++) { \ | |||||
| output[i] = *input * scale; \ | output[i] = *input * scale; \ | ||||
| input += s->avctx->channels; \ | input += s->avctx->channels; \ | ||||
| } \ | } \ | ||||
| } \ | } \ | ||||
| } while (0) | } while (0) | ||||
| static int encode_frame_int16(LAMEContext *s, void *samples) | |||||
| static int encode_frame_int16(LAMEContext *s, void *samples, int nb_samples) | |||||
| { | { | ||||
| if (s->avctx->channels > 1) { | if (s->avctx->channels > 1) { | ||||
| return lame_encode_buffer_interleaved(s->gfp, samples, | return lame_encode_buffer_interleaved(s->gfp, samples, | ||||
| s->avctx->frame_size, | |||||
| nb_samples, | |||||
| s->buffer + s->buffer_index, | s->buffer + s->buffer_index, | ||||
| BUFFER_SIZE - s->buffer_index); | BUFFER_SIZE - s->buffer_index); | ||||
| } else { | } else { | ||||
| return lame_encode_buffer(s->gfp, samples, NULL, s->avctx->frame_size, | |||||
| return lame_encode_buffer(s->gfp, samples, NULL, nb_samples, | |||||
| s->buffer + s->buffer_index, | s->buffer + s->buffer_index, | ||||
| BUFFER_SIZE - s->buffer_index); | BUFFER_SIZE - s->buffer_index); | ||||
| } | } | ||||
| } | } | ||||
| static int encode_frame_int32(LAMEContext *s, void *samples) | |||||
| static int encode_frame_int32(LAMEContext *s, void *samples, int nb_samples) | |||||
| { | { | ||||
| DEINTERLEAVE(int32_t, 1); | DEINTERLEAVE(int32_t, 1); | ||||
| return lame_encode_buffer_int(s->gfp, | return lame_encode_buffer_int(s->gfp, | ||||
| s->planar_samples[0], s->planar_samples[1], | s->planar_samples[0], s->planar_samples[1], | ||||
| s->avctx->frame_size, | |||||
| nb_samples, | |||||
| s->buffer + s->buffer_index, | s->buffer + s->buffer_index, | ||||
| BUFFER_SIZE - s->buffer_index); | BUFFER_SIZE - s->buffer_index); | ||||
| } | } | ||||
| static int encode_frame_float(LAMEContext *s, void *samples) | |||||
| static int encode_frame_float(LAMEContext *s, void *samples, int nb_samples) | |||||
| { | { | ||||
| DEINTERLEAVE(float, 32768.0f); | DEINTERLEAVE(float, 32768.0f); | ||||
| return lame_encode_buffer_float(s->gfp, | return lame_encode_buffer_float(s->gfp, | ||||
| s->planar_samples[0], s->planar_samples[1], | s->planar_samples[0], s->planar_samples[1], | ||||
| s->avctx->frame_size, | |||||
| nb_samples, | |||||
| s->buffer + s->buffer_index, | s->buffer + s->buffer_index, | ||||
| BUFFER_SIZE - s->buffer_index); | BUFFER_SIZE - s->buffer_index); | ||||
| } | } | ||||
| static int mp3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, | |||||
| int buf_size, void *data) | |||||
| static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| LAMEContext *s = avctx->priv_data; | LAMEContext *s = avctx->priv_data; | ||||
| MPADecodeHeader hdr; | MPADecodeHeader hdr; | ||||
| int len; | |||||
| int len, ret; | |||||
| int lame_result; | int lame_result; | ||||
| if (data) { | |||||
| if (frame) { | |||||
| switch (avctx->sample_fmt) { | switch (avctx->sample_fmt) { | ||||
| case AV_SAMPLE_FMT_S16: | case AV_SAMPLE_FMT_S16: | ||||
| lame_result = encode_frame_int16(s, data); | |||||
| lame_result = encode_frame_int16(s, frame->data[0], frame->nb_samples); | |||||
| break; | break; | ||||
| case AV_SAMPLE_FMT_S32: | case AV_SAMPLE_FMT_S32: | ||||
| lame_result = encode_frame_int32(s, data); | |||||
| lame_result = encode_frame_int32(s, frame->data[0], frame->nb_samples); | |||||
| break; | break; | ||||
| case AV_SAMPLE_FMT_FLT: | case AV_SAMPLE_FMT_FLT: | ||||
| lame_result = encode_frame_float(s, data); | |||||
| lame_result = encode_frame_float(s, frame->data[0], frame->nb_samples); | |||||
| break; | break; | ||||
| default: | default: | ||||
| return AVERROR_BUG; | return AVERROR_BUG; | ||||
| @@ -223,6 +236,12 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, | |||||
| } | } | ||||
| s->buffer_index += lame_result; | s->buffer_index += lame_result; | ||||
| /* add current frame to the queue */ | |||||
| if (frame) { | |||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } | |||||
| /* Move 1 frame from the LAME buffer to the output packet, if available. | /* Move 1 frame from the LAME buffer to the output packet, if available. | ||||
| We have to parse the first frame header in the output buffer to | We have to parse the first frame header in the output buffer to | ||||
| determine the frame size. */ | determine the frame size. */ | ||||
| @@ -236,12 +255,22 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, unsigned char *frame, | |||||
| av_dlog(avctx, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, | av_dlog(avctx, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, | ||||
| s->buffer_index); | s->buffer_index); | ||||
| if (len <= s->buffer_index) { | if (len <= s->buffer_index) { | ||||
| memcpy(frame, s->buffer, len); | |||||
| if ((ret = ff_alloc_packet(avpkt, len))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| memcpy(avpkt->data, s->buffer, len); | |||||
| s->buffer_index -= len; | s->buffer_index -= len; | ||||
| memmove(s->buffer, s->buffer + len, s->buffer_index); | memmove(s->buffer, s->buffer + len, s->buffer_index); | ||||
| return len; | |||||
| } else | |||||
| return 0; | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = len; | |||||
| *got_packet_ptr = 1; | |||||
| } | |||||
| return 0; | |||||
| } | } | ||||
| #define OFFSET(x) offsetof(LAMEContext, x) | #define OFFSET(x) offsetof(LAMEContext, x) | ||||
| @@ -273,9 +302,9 @@ AVCodec ff_libmp3lame_encoder = { | |||||
| .id = CODEC_ID_MP3, | .id = CODEC_ID_MP3, | ||||
| .priv_data_size = sizeof(LAMEContext), | .priv_data_size = sizeof(LAMEContext), | ||||
| .init = mp3lame_encode_init, | .init = mp3lame_encode_init, | ||||
| .encode = mp3lame_encode_frame, | |||||
| .encode2 = mp3lame_encode_frame, | |||||
| .close = mp3lame_encode_close, | .close = mp3lame_encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY, | |||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, | |||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32, | .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32, | ||||
| AV_SAMPLE_FMT_FLT, | AV_SAMPLE_FMT_FLT, | ||||
| AV_SAMPLE_FMT_S16, | AV_SAMPLE_FMT_S16, | ||||
| @@ -22,6 +22,8 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "libavutil/avstring.h" | #include "libavutil/avstring.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "internal.h" | |||||
| static void amr_decode_fix_avctx(AVCodecContext *avctx) | static void amr_decode_fix_avctx(AVCodecContext *avctx) | ||||
| { | { | ||||
| @@ -85,6 +87,7 @@ typedef struct AMRContext { | |||||
| int enc_mode; | int enc_mode; | ||||
| int enc_dtx; | int enc_dtx; | ||||
| int enc_last_frame; | int enc_last_frame; | ||||
| AudioFrameQueue afq; | |||||
| } AMRContext; | } AMRContext; | ||||
| static const AVOption options[] = { | static const AVOption options[] = { | ||||
| @@ -196,9 +199,12 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx) | |||||
| avctx->frame_size = 160; | avctx->frame_size = 160; | ||||
| avctx->delay = 50; | avctx->delay = 50; | ||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| #endif | |||||
| s->enc_state = Encoder_Interface_init(s->enc_dtx); | s->enc_state = Encoder_Interface_init(s->enc_dtx); | ||||
| if (!s->enc_state) { | if (!s->enc_state) { | ||||
| @@ -218,38 +224,49 @@ static av_cold int amr_nb_encode_close(AVCodecContext *avctx) | |||||
| AMRContext *s = avctx->priv_data; | AMRContext *s = avctx->priv_data; | ||||
| Encoder_Interface_exit(s->enc_state); | Encoder_Interface_exit(s->enc_state); | ||||
| ff_af_queue_close(&s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int amr_nb_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame/*out*/, | |||||
| int buf_size, void *data/*in*/) | |||||
| static int amr_nb_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| AMRContext *s = avctx->priv_data; | AMRContext *s = avctx->priv_data; | ||||
| int written; | |||||
| int written, ret; | |||||
| int16_t *flush_buf = NULL; | int16_t *flush_buf = NULL; | ||||
| const int16_t *samples = data; | |||||
| const int16_t *samples = frame ? (const int16_t *)frame->data[0] : NULL; | |||||
| if (s->enc_bitrate != avctx->bit_rate) { | if (s->enc_bitrate != avctx->bit_rate) { | ||||
| s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); | s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); | ||||
| s->enc_bitrate = avctx->bit_rate; | s->enc_bitrate = avctx->bit_rate; | ||||
| } | } | ||||
| if (data) { | |||||
| if (avctx->frame_size < 160) { | |||||
| flush_buf = av_mallocz(160 * sizeof(*flush_buf)); | |||||
| if ((ret = ff_alloc_packet(avpkt, 32))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| if (frame) { | |||||
| if (frame->nb_samples < avctx->frame_size) { | |||||
| flush_buf = av_mallocz(avctx->frame_size * sizeof(*flush_buf)); | |||||
| if (!flush_buf) | if (!flush_buf) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| memcpy(flush_buf, samples, avctx->frame_size * sizeof(*flush_buf)); | |||||
| memcpy(flush_buf, samples, frame->nb_samples * sizeof(*flush_buf)); | |||||
| samples = flush_buf; | samples = flush_buf; | ||||
| if (avctx->frame_size < 110) | |||||
| if (frame->nb_samples < avctx->frame_size - avctx->delay) | |||||
| s->enc_last_frame = -1; | s->enc_last_frame = -1; | ||||
| } | } | ||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) { | |||||
| av_freep(&flush_buf); | |||||
| return ret; | |||||
| } | |||||
| } else { | } else { | ||||
| if (s->enc_last_frame < 0) | if (s->enc_last_frame < 0) | ||||
| return 0; | return 0; | ||||
| flush_buf = av_mallocz(160 * sizeof(*flush_buf)); | |||||
| flush_buf = av_mallocz(avctx->frame_size * sizeof(*flush_buf)); | |||||
| if (!flush_buf) | if (!flush_buf) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| samples = flush_buf; | samples = flush_buf; | ||||
| @@ -257,12 +274,18 @@ static int amr_nb_encode_frame(AVCodecContext *avctx, | |||||
| } | } | ||||
| written = Encoder_Interface_Encode(s->enc_state, s->enc_mode, samples, | written = Encoder_Interface_Encode(s->enc_state, s->enc_mode, samples, | ||||
| frame, 0); | |||||
| avpkt->data, 0); | |||||
| av_dlog(avctx, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n", | av_dlog(avctx, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n", | ||||
| written, s->enc_mode, frame[0]); | written, s->enc_mode, frame[0]); | ||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = written; | |||||
| *got_packet_ptr = 1; | |||||
| av_freep(&flush_buf); | av_freep(&flush_buf); | ||||
| return written; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_libopencore_amrnb_encoder = { | AVCodec ff_libopencore_amrnb_encoder = { | ||||
| @@ -271,7 +294,7 @@ AVCodec ff_libopencore_amrnb_encoder = { | |||||
| .id = CODEC_ID_AMR_NB, | .id = CODEC_ID_AMR_NB, | ||||
| .priv_data_size = sizeof(AMRContext), | .priv_data_size = sizeof(AMRContext), | ||||
| .init = amr_nb_encode_init, | .init = amr_nb_encode_init, | ||||
| .encode = amr_nb_encode_frame, | |||||
| .encode2 = amr_nb_encode_frame, | |||||
| .close = amr_nb_encode_close, | .close = amr_nb_encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, | .capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -70,6 +70,7 @@ | |||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "audio_frame_queue.h" | |||||
| typedef struct { | typedef struct { | ||||
| AVClass *class; ///< AVClass for private options | AVClass *class; ///< AVClass for private options | ||||
| @@ -81,8 +82,7 @@ typedef struct { | |||||
| int cbr_quality; ///< CBR quality 0 to 10 | int cbr_quality; ///< CBR quality 0 to 10 | ||||
| int abr; ///< flag to enable ABR | int abr; ///< flag to enable ABR | ||||
| int pkt_frame_count; ///< frame count for the current packet | int pkt_frame_count; ///< frame count for the current packet | ||||
| int64_t next_pts; ///< next pts, in sample_rate time base | |||||
| int pkt_sample_count; ///< sample count in the current packet | |||||
| AudioFrameQueue afq; ///< frame queue | |||||
| } LibSpeexEncContext; | } LibSpeexEncContext; | ||||
| static av_cold void print_enc_params(AVCodecContext *avctx, | static av_cold void print_enc_params(AVCodecContext *avctx, | ||||
| @@ -200,6 +200,7 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| /* set encoding delay */ | /* set encoding delay */ | ||||
| speex_encoder_ctl(s->enc_state, SPEEX_GET_LOOKAHEAD, &avctx->delay); | speex_encoder_ctl(s->enc_state, SPEEX_GET_LOOKAHEAD, &avctx->delay); | ||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| /* create header packet bytes from header struct */ | /* create header packet bytes from header struct */ | ||||
| /* note: libspeex allocates the memory for header_data, which is freed | /* note: libspeex allocates the memory for header_data, which is freed | ||||
| @@ -208,13 +209,22 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| /* allocate extradata and coded_frame */ | /* allocate extradata and coded_frame */ | ||||
| avctx->extradata = av_malloc(header_size + FF_INPUT_BUFFER_PADDING_SIZE); | avctx->extradata = av_malloc(header_size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
| if (!avctx->extradata) { | |||||
| speex_header_free(header_data); | |||||
| speex_encoder_destroy(s->enc_state); | |||||
| av_log(avctx, AV_LOG_ERROR, "memory allocation error\n"); | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->extradata || !avctx->coded_frame) { | |||||
| if (!avctx->coded_frame) { | |||||
| av_freep(&avctx->extradata); | |||||
| speex_header_free(header_data); | speex_header_free(header_data); | ||||
| speex_encoder_destroy(s->enc_state); | speex_encoder_destroy(s->enc_state); | ||||
| av_log(avctx, AV_LOG_ERROR, "memory allocation error\n"); | av_log(avctx, AV_LOG_ERROR, "memory allocation error\n"); | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| } | } | ||||
| #endif | |||||
| /* copy header packet to extradata */ | /* copy header packet to extradata */ | ||||
| memcpy(avctx->extradata, header_data, header_size); | memcpy(avctx->extradata, header_data, header_size); | ||||
| @@ -228,19 +238,21 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, | |||||
| void *data) | |||||
| static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| LibSpeexEncContext *s = avctx->priv_data; | LibSpeexEncContext *s = avctx->priv_data; | ||||
| int16_t *samples = data; | |||||
| int16_t *samples = frame ? (int16_t *)frame->data[0] : NULL; | |||||
| int ret; | |||||
| if (data) { | |||||
| if (samples) { | |||||
| /* encode Speex frame */ | /* encode Speex frame */ | ||||
| if (avctx->channels == 2) | if (avctx->channels == 2) | ||||
| speex_encode_stereo_int(samples, s->header.frame_size, &s->bits); | speex_encode_stereo_int(samples, s->header.frame_size, &s->bits); | ||||
| speex_encode_int(s->enc_state, samples, &s->bits); | speex_encode_int(s->enc_state, samples, &s->bits); | ||||
| s->pkt_frame_count++; | s->pkt_frame_count++; | ||||
| s->pkt_sample_count += avctx->frame_size; | |||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } else { | } else { | ||||
| /* handle end-of-stream */ | /* handle end-of-stream */ | ||||
| if (!s->pkt_frame_count) | if (!s->pkt_frame_count) | ||||
| @@ -255,18 +267,20 @@ static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, | |||||
| /* write output if all frames for the packet have been encoded */ | /* write output if all frames for the packet have been encoded */ | ||||
| if (s->pkt_frame_count == s->frames_per_packet) { | if (s->pkt_frame_count == s->frames_per_packet) { | ||||
| s->pkt_frame_count = 0; | s->pkt_frame_count = 0; | ||||
| avctx->coded_frame->pts = ff_samples_to_time_base(avctx, s->next_pts - | |||||
| avctx->delay); | |||||
| s->next_pts += s->pkt_sample_count; | |||||
| s->pkt_sample_count = 0; | |||||
| if (buf_size > speex_bits_nbytes(&s->bits)) { | |||||
| int ret = speex_bits_write(&s->bits, frame, buf_size); | |||||
| speex_bits_reset(&s->bits); | |||||
| if ((ret = ff_alloc_packet(avpkt, speex_bits_nbytes(&s->bits)))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | return ret; | ||||
| } else { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer too small"); | |||||
| return AVERROR(EINVAL); | |||||
| } | } | ||||
| ret = speex_bits_write(&s->bits, avpkt->data, avpkt->size); | |||||
| speex_bits_reset(&s->bits); | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, s->frames_per_packet * avctx->frame_size, | |||||
| &avpkt->pts, &avpkt->duration); | |||||
| avpkt->size = ret; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -278,7 +292,10 @@ static av_cold int encode_close(AVCodecContext *avctx) | |||||
| speex_bits_destroy(&s->bits); | speex_bits_destroy(&s->bits); | ||||
| speex_encoder_destroy(s->enc_state); | speex_encoder_destroy(s->enc_state); | ||||
| ff_af_queue_close(&s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&avctx->extradata); | av_freep(&avctx->extradata); | ||||
| return 0; | return 0; | ||||
| @@ -312,7 +329,7 @@ AVCodec ff_libspeex_encoder = { | |||||
| .id = CODEC_ID_SPEEX, | .id = CODEC_ID_SPEEX, | ||||
| .priv_data_size = sizeof(LibSpeexEncContext), | .priv_data_size = sizeof(LibSpeexEncContext), | ||||
| .init = encode_init, | .init = encode_init, | ||||
| .encode = encode_frame, | |||||
| .encode2 = encode_frame, | |||||
| .close = encode_close, | .close = encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY, | .capabilities = CODEC_CAP_DELAY, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, | .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, | ||||
| @@ -23,25 +23,61 @@ | |||||
| #include <vo-aacenc/cmnMemory.h> | #include <vo-aacenc/cmnMemory.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "internal.h" | |||||
| #include "mpeg4audio.h" | #include "mpeg4audio.h" | ||||
| #define FRAME_SIZE 1024 | |||||
| #define ENC_DELAY 1600 | |||||
| typedef struct AACContext { | typedef struct AACContext { | ||||
| VO_AUDIO_CODECAPI codec_api; | VO_AUDIO_CODECAPI codec_api; | ||||
| VO_HANDLE handle; | VO_HANDLE handle; | ||||
| VO_MEM_OPERATOR mem_operator; | VO_MEM_OPERATOR mem_operator; | ||||
| VO_CODEC_INIT_USERDATA user_data; | VO_CODEC_INIT_USERDATA user_data; | ||||
| VO_PBYTE end_buffer; | |||||
| AudioFrameQueue afq; | |||||
| int last_frame; | |||||
| int last_samples; | |||||
| } AACContext; | } AACContext; | ||||
| static int aac_encode_close(AVCodecContext *avctx) | |||||
| { | |||||
| AACContext *s = avctx->priv_data; | |||||
| s->codec_api.Uninit(s->handle); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | |||||
| #endif | |||||
| av_freep(&avctx->extradata); | |||||
| ff_af_queue_close(&s->afq); | |||||
| av_freep(&s->end_buffer); | |||||
| return 0; | |||||
| } | |||||
| static av_cold int aac_encode_init(AVCodecContext *avctx) | static av_cold int aac_encode_init(AVCodecContext *avctx) | ||||
| { | { | ||||
| AACContext *s = avctx->priv_data; | AACContext *s = avctx->priv_data; | ||||
| AACENC_PARAM params = { 0 }; | AACENC_PARAM params = { 0 }; | ||||
| int index; | |||||
| int index, ret; | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| avctx->frame_size = 1024; | |||||
| #endif | |||||
| avctx->frame_size = FRAME_SIZE; | |||||
| avctx->delay = ENC_DELAY; | |||||
| s->last_frame = 2; | |||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| s->end_buffer = av_mallocz(avctx->frame_size * avctx->channels * 2); | |||||
| if (!s->end_buffer) { | |||||
| ret = AVERROR(ENOMEM); | |||||
| goto error; | |||||
| } | |||||
| voGetAACEncAPI(&s->codec_api); | voGetAACEncAPI(&s->codec_api); | ||||
| @@ -61,7 +97,8 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) | |||||
| if (s->codec_api.SetParam(s->handle, VO_PID_AAC_ENCPARAM, ¶ms) | if (s->codec_api.SetParam(s->handle, VO_PID_AAC_ENCPARAM, ¶ms) | ||||
| != VO_ERR_NONE) { | != VO_ERR_NONE) { | ||||
| av_log(avctx, AV_LOG_ERROR, "Unable to set encoding parameters\n"); | av_log(avctx, AV_LOG_ERROR, "Unable to set encoding parameters\n"); | ||||
| return AVERROR(EINVAL); | |||||
| ret = AVERROR(EINVAL); | |||||
| goto error; | |||||
| } | } | ||||
| for (index = 0; index < 16; index++) | for (index = 0; index < 16; index++) | ||||
| @@ -70,43 +107,69 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) | |||||
| if (index == 16) { | if (index == 16) { | ||||
| av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", | av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", | ||||
| avctx->sample_rate); | avctx->sample_rate); | ||||
| return AVERROR(ENOSYS); | |||||
| ret = AVERROR(ENOSYS); | |||||
| goto error; | |||||
| } | } | ||||
| if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) { | if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) { | ||||
| avctx->extradata_size = 2; | avctx->extradata_size = 2; | ||||
| avctx->extradata = av_mallocz(avctx->extradata_size + | avctx->extradata = av_mallocz(avctx->extradata_size + | ||||
| FF_INPUT_BUFFER_PADDING_SIZE); | FF_INPUT_BUFFER_PADDING_SIZE); | ||||
| if (!avctx->extradata) | |||||
| return AVERROR(ENOMEM); | |||||
| if (!avctx->extradata) { | |||||
| ret = AVERROR(ENOMEM); | |||||
| goto error; | |||||
| } | |||||
| avctx->extradata[0] = 0x02 << 3 | index >> 1; | avctx->extradata[0] = 0x02 << 3 | index >> 1; | ||||
| avctx->extradata[1] = (index & 0x01) << 7 | avctx->channels << 3; | avctx->extradata[1] = (index & 0x01) << 7 | avctx->channels << 3; | ||||
| } | } | ||||
| return 0; | return 0; | ||||
| error: | |||||
| aac_encode_close(avctx); | |||||
| return ret; | |||||
| } | } | ||||
| static int aac_encode_close(AVCodecContext *avctx) | |||||
| { | |||||
| AACContext *s = avctx->priv_data; | |||||
| s->codec_api.Uninit(s->handle); | |||||
| av_freep(&avctx->coded_frame); | |||||
| return 0; | |||||
| } | |||||
| static int aac_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame/*out*/, | |||||
| int buf_size, void *data/*in*/) | |||||
| static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| AACContext *s = avctx->priv_data; | AACContext *s = avctx->priv_data; | ||||
| VO_CODECBUFFER input = { 0 }, output = { 0 }; | VO_CODECBUFFER input = { 0 }, output = { 0 }; | ||||
| VO_AUDIO_OUTPUTINFO output_info = { { 0 } }; | VO_AUDIO_OUTPUTINFO output_info = { { 0 } }; | ||||
| VO_PBYTE samples; | |||||
| int ret; | |||||
| /* handle end-of-stream small frame and flushing */ | |||||
| if (!frame) { | |||||
| if (s->last_frame <= 0) | |||||
| return 0; | |||||
| if (s->last_samples > 0 && s->last_samples < ENC_DELAY - FRAME_SIZE) { | |||||
| s->last_samples = 0; | |||||
| s->last_frame--; | |||||
| } | |||||
| s->last_frame--; | |||||
| memset(s->end_buffer, 0, 2 * avctx->channels * avctx->frame_size); | |||||
| samples = s->end_buffer; | |||||
| } else { | |||||
| if (frame->nb_samples < avctx->frame_size) { | |||||
| s->last_samples = frame->nb_samples; | |||||
| memcpy(s->end_buffer, frame->data[0], 2 * avctx->channels * frame->nb_samples); | |||||
| samples = s->end_buffer; | |||||
| } else { | |||||
| samples = (VO_PBYTE)frame->data[0]; | |||||
| } | |||||
| /* add current frame to the queue */ | |||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } | |||||
| if ((ret = ff_alloc_packet(avpkt, FFMAX(8192, 768 * avctx->channels)))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| input.Buffer = data; | |||||
| input.Length = 2 * avctx->channels * avctx->frame_size; | |||||
| output.Buffer = frame; | |||||
| output.Length = buf_size; | |||||
| input.Buffer = samples; | |||||
| input.Length = 2 * avctx->channels * avctx->frame_size; | |||||
| output.Buffer = avpkt->data; | |||||
| output.Length = avpkt->size; | |||||
| s->codec_api.SetInputData(s->handle, &input); | s->codec_api.SetInputData(s->handle, &input); | ||||
| if (s->codec_api.GetOutputData(s->handle, &output, &output_info) | if (s->codec_api.GetOutputData(s->handle, &output, &output_info) | ||||
| @@ -114,7 +177,14 @@ static int aac_encode_frame(AVCodecContext *avctx, | |||||
| av_log(avctx, AV_LOG_ERROR, "Unable to encode frame\n"); | av_log(avctx, AV_LOG_ERROR, "Unable to encode frame\n"); | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| return output.Length; | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = output.Length; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_libvo_aacenc_encoder = { | AVCodec ff_libvo_aacenc_encoder = { | ||||
| @@ -123,8 +193,9 @@ AVCodec ff_libvo_aacenc_encoder = { | |||||
| .id = CODEC_ID_AAC, | .id = CODEC_ID_AAC, | ||||
| .priv_data_size = sizeof(AACContext), | .priv_data_size = sizeof(AACContext), | ||||
| .init = aac_encode_init, | .init = aac_encode_init, | ||||
| .encode = aac_encode_frame, | |||||
| .encode2 = aac_encode_frame, | |||||
| .close = aac_encode_close, | .close = aac_encode_close, | ||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | |||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn AAC"), | .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn AAC"), | ||||
| }; | }; | ||||
| @@ -21,9 +21,12 @@ | |||||
| #include <vo-amrwbenc/enc_if.h> | #include <vo-amrwbenc/enc_if.h> | ||||
| #include "avcodec.h" | |||||
| #include "libavutil/avstring.h" | #include "libavutil/avstring.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "avcodec.h" | |||||
| #include "internal.h" | |||||
| #define MAX_PACKET_SIZE (1 + (477 + 7) / 8) | |||||
| typedef struct AMRWBContext { | typedef struct AMRWBContext { | ||||
| AVClass *av_class; | AVClass *av_class; | ||||
| @@ -86,9 +89,12 @@ static av_cold int amr_wb_encode_init(AVCodecContext *avctx) | |||||
| s->last_bitrate = avctx->bit_rate; | s->last_bitrate = avctx->bit_rate; | ||||
| avctx->frame_size = 320; | avctx->frame_size = 320; | ||||
| avctx->delay = 80; | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| #endif | |||||
| s->state = E_IF_init(); | s->state = E_IF_init(); | ||||
| @@ -104,19 +110,34 @@ static int amr_wb_encode_close(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int amr_wb_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame/*out*/, | |||||
| int buf_size, void *data/*in*/) | |||||
| static int amr_wb_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| AMRWBContext *s = avctx->priv_data; | AMRWBContext *s = avctx->priv_data; | ||||
| int size; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| int size, ret; | |||||
| if ((ret = ff_alloc_packet(avpkt, MAX_PACKET_SIZE))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| if (s->last_bitrate != avctx->bit_rate) { | if (s->last_bitrate != avctx->bit_rate) { | ||||
| s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); | s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); | ||||
| s->last_bitrate = avctx->bit_rate; | s->last_bitrate = avctx->bit_rate; | ||||
| } | } | ||||
| size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); | |||||
| return size; | |||||
| size = E_IF_encode(s->state, s->mode, samples, avpkt->data, s->allow_dtx); | |||||
| if (size <= 0 || size > MAX_PACKET_SIZE) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error encoding frame\n"); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); | |||||
| avpkt->size = size; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_libvo_amrwbenc_encoder = { | AVCodec ff_libvo_amrwbenc_encoder = { | ||||
| @@ -125,7 +146,7 @@ AVCodec ff_libvo_amrwbenc_encoder = { | |||||
| .id = CODEC_ID_AMR_WB, | .id = CODEC_ID_AMR_WB, | ||||
| .priv_data_size = sizeof(AMRWBContext), | .priv_data_size = sizeof(AMRWBContext), | ||||
| .init = amr_wb_encode_init, | .init = amr_wb_encode_init, | ||||
| .encode = amr_wb_encode_frame, | |||||
| .encode2 = amr_wb_encode_frame, | |||||
| .close = amr_wb_encode_close, | .close = amr_wb_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn Adaptive Multi-Rate " | .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn Adaptive Multi-Rate " | ||||
| @@ -29,9 +29,11 @@ | |||||
| #include "libavutil/fifo.h" | #include "libavutil/fifo.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "vorbis.h" | #include "vorbis.h" | ||||
| #include "vorbis_parser.h" | |||||
| #undef NDEBUG | #undef NDEBUG | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -56,6 +58,8 @@ typedef struct OggVorbisContext { | |||||
| vorbis_comment vc; /**< VorbisComment info */ | vorbis_comment vc; /**< VorbisComment info */ | ||||
| ogg_packet op; /**< ogg packet */ | ogg_packet op; /**< ogg packet */ | ||||
| double iblock; /**< impulse block bias option */ | double iblock; /**< impulse block bias option */ | ||||
| VorbisParseContext vp; /**< parse context to get durations */ | |||||
| AudioFrameQueue afq; /**< frame queue for timestamps */ | |||||
| } OggVorbisContext; | } OggVorbisContext; | ||||
| static const AVOption options[] = { | static const AVOption options[] = { | ||||
| @@ -186,7 +190,10 @@ static av_cold int oggvorbis_encode_close(AVCodecContext *avctx) | |||||
| vorbis_info_clear(&s->vi); | vorbis_info_clear(&s->vi); | ||||
| av_fifo_free(s->pkt_fifo); | av_fifo_free(s->pkt_fifo); | ||||
| ff_af_queue_close(&s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&avctx->extradata); | av_freep(&avctx->extradata); | ||||
| return 0; | return 0; | ||||
| @@ -247,9 +254,15 @@ static av_cold int oggvorbis_encode_init(AVCodecContext *avctx) | |||||
| offset += header_code.bytes; | offset += header_code.bytes; | ||||
| assert(offset == avctx->extradata_size); | assert(offset == avctx->extradata_size); | ||||
| if ((ret = avpriv_vorbis_parse_extradata(avctx, &s->vp)) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "invalid extradata\n"); | |||||
| return ret; | |||||
| } | |||||
| vorbis_comment_clear(&s->vc); | vorbis_comment_clear(&s->vc); | ||||
| avctx->frame_size = OGGVORBIS_FRAME_SIZE; | avctx->frame_size = OGGVORBIS_FRAME_SIZE; | ||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| s->pkt_fifo = av_fifo_alloc(BUFFER_SIZE); | s->pkt_fifo = av_fifo_alloc(BUFFER_SIZE); | ||||
| if (!s->pkt_fifo) { | if (!s->pkt_fifo) { | ||||
| @@ -257,11 +270,13 @@ static av_cold int oggvorbis_encode_init(AVCodecContext *avctx) | |||||
| goto error; | goto error; | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -269,17 +284,17 @@ error: | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| static int oggvorbis_encode_frame(AVCodecContext *avctx, unsigned char *packets, | |||||
| int buf_size, void *data) | |||||
| static int oggvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| OggVorbisContext *s = avctx->priv_data; | OggVorbisContext *s = avctx->priv_data; | ||||
| ogg_packet op; | ogg_packet op; | ||||
| float *audio = data; | |||||
| int pkt_size, ret; | |||||
| int ret, duration; | |||||
| /* send samples to libvorbis */ | /* send samples to libvorbis */ | ||||
| if (data) { | |||||
| const int samples = avctx->frame_size; | |||||
| if (frame) { | |||||
| const float *audio = (const float *)frame->data[0]; | |||||
| const int samples = frame->nb_samples; | |||||
| float **buffer; | float **buffer; | ||||
| int c, channels = s->vi.channels; | int c, channels = s->vi.channels; | ||||
| @@ -295,6 +310,8 @@ static int oggvorbis_encode_frame(AVCodecContext *avctx, unsigned char *packets, | |||||
| av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n"); | av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n"); | ||||
| return vorbis_error_to_averror(ret); | return vorbis_error_to_averror(ret); | ||||
| } | } | ||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } else { | } else { | ||||
| if (!s->eof) | if (!s->eof) | ||||
| if ((ret = vorbis_analysis_wrote(&s->vd, 0)) < 0) { | if ((ret = vorbis_analysis_wrote(&s->vd, 0)) < 0) { | ||||
| @@ -330,22 +347,34 @@ static int oggvorbis_encode_frame(AVCodecContext *avctx, unsigned char *packets, | |||||
| return vorbis_error_to_averror(ret); | return vorbis_error_to_averror(ret); | ||||
| } | } | ||||
| /* output then next packet from the output buffer, if available */ | |||||
| pkt_size = 0; | |||||
| if (av_fifo_size(s->pkt_fifo) >= sizeof(ogg_packet)) { | |||||
| av_fifo_generic_read(s->pkt_fifo, &op, sizeof(ogg_packet), NULL); | |||||
| pkt_size = op.bytes; | |||||
| // FIXME: we should use the user-supplied pts and duration | |||||
| avctx->coded_frame->pts = ff_samples_to_time_base(avctx, | |||||
| op.granulepos); | |||||
| if (pkt_size > buf_size) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); | |||||
| return AVERROR(EINVAL); | |||||
| /* check for available packets */ | |||||
| if (av_fifo_size(s->pkt_fifo) < sizeof(ogg_packet)) | |||||
| return 0; | |||||
| av_fifo_generic_read(s->pkt_fifo, &op, sizeof(ogg_packet), NULL); | |||||
| if ((ret = ff_alloc_packet(avpkt, op.bytes))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| av_fifo_generic_read(s->pkt_fifo, avpkt->data, op.bytes, NULL); | |||||
| avpkt->pts = ff_samples_to_time_base(avctx, op.granulepos); | |||||
| duration = avpriv_vorbis_parse_frame(&s->vp, avpkt->data, avpkt->size); | |||||
| if (duration > 0) { | |||||
| /* we do not know encoder delay until we get the first packet from | |||||
| * libvorbis, so we have to update the AudioFrameQueue counts */ | |||||
| if (!avctx->delay) { | |||||
| avctx->delay = duration; | |||||
| s->afq.remaining_delay += duration; | |||||
| s->afq.remaining_samples += duration; | |||||
| } | } | ||||
| av_fifo_generic_read(s->pkt_fifo, packets, pkt_size, NULL); | |||||
| ff_af_queue_remove(&s->afq, duration, &avpkt->pts, &avpkt->duration); | |||||
| } | } | ||||
| return pkt_size; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_libvorbis_encoder = { | AVCodec ff_libvorbis_encoder = { | ||||
| @@ -354,7 +383,7 @@ AVCodec ff_libvorbis_encoder = { | |||||
| .id = CODEC_ID_VORBIS, | .id = CODEC_ID_VORBIS, | ||||
| .priv_data_size = sizeof(OggVorbisContext), | .priv_data_size = sizeof(OggVorbisContext), | ||||
| .init = oggvorbis_encode_init, | .init = oggvorbis_encode_init, | ||||
| .encode = oggvorbis_encode_frame, | |||||
| .encode2 = oggvorbis_encode_frame, | |||||
| .close = oggvorbis_encode_close, | .close = oggvorbis_encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY, | .capabilities = CODEC_CAP_DELAY, | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, | .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, | ||||
| @@ -80,6 +80,7 @@ static av_cold int MPA_encode_init(AVCodecContext *avctx) | |||||
| bitrate = bitrate / 1000; | bitrate = bitrate / 1000; | ||||
| s->nb_channels = channels; | s->nb_channels = channels; | ||||
| avctx->frame_size = MPA_FRAME_SIZE; | avctx->frame_size = MPA_FRAME_SIZE; | ||||
| avctx->delay = 512 - 32 + 1; | |||||
| /* encoding freq */ | /* encoding freq */ | ||||
| s->lsf = 0; | s->lsf = 0; | ||||
| @@ -180,9 +181,11 @@ static av_cold int MPA_encode_init(AVCodecContext *avctx) | |||||
| total_quant_bits[i] = 12 * v; | total_quant_bits[i] = 12 * v; | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame= avcodec_alloc_frame(); | avctx->coded_frame= avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) | if (!avctx->coded_frame) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -726,14 +729,14 @@ static void encode_frame(MpegAudioContext *s, | |||||
| flush_put_bits(p); | flush_put_bits(p); | ||||
| } | } | ||||
| static int MPA_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame, int buf_size, void *data) | |||||
| static int MPA_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| MpegAudioContext *s = avctx->priv_data; | MpegAudioContext *s = avctx->priv_data; | ||||
| const short *samples = data; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| short smr[MPA_MAX_CHANNELS][SBLIMIT]; | short smr[MPA_MAX_CHANNELS][SBLIMIT]; | ||||
| unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; | unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; | ||||
| int padding, i; | |||||
| int padding, i, ret; | |||||
| for(i=0;i<s->nb_channels;i++) { | for(i=0;i<s->nb_channels;i++) { | ||||
| filter(s, i, samples + i, s->nb_channels); | filter(s, i, samples + i, s->nb_channels); | ||||
| @@ -748,16 +751,28 @@ static int MPA_encode_frame(AVCodecContext *avctx, | |||||
| } | } | ||||
| compute_bit_allocation(s, smr, bit_alloc, &padding); | compute_bit_allocation(s, smr, bit_alloc, &padding); | ||||
| init_put_bits(&s->pb, frame, MPA_MAX_CODED_FRAME_SIZE); | |||||
| if ((ret = ff_alloc_packet(avpkt, MPA_MAX_CODED_FRAME_SIZE))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| init_put_bits(&s->pb, avpkt->data, avpkt->size); | |||||
| encode_frame(s, bit_alloc, padding); | encode_frame(s, bit_alloc, padding); | ||||
| return put_bits_ptr(&s->pb) - s->pb.buf; | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); | |||||
| avpkt->size = put_bits_count(&s->pb) / 8; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| static av_cold int MPA_encode_close(AVCodecContext *avctx) | static av_cold int MPA_encode_close(AVCodecContext *avctx) | ||||
| { | { | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -772,7 +787,7 @@ AVCodec ff_mp2_encoder = { | |||||
| .id = CODEC_ID_MP2, | .id = CODEC_ID_MP2, | ||||
| .priv_data_size = sizeof(MpegAudioContext), | .priv_data_size = sizeof(MpegAudioContext), | ||||
| .init = MPA_encode_init, | .init = MPA_encode_init, | ||||
| .encode = MPA_encode_frame, | |||||
| .encode2 = MPA_encode_frame, | |||||
| .close = MPA_encode_close, | .close = MPA_encode_close, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0}, | .supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0}, | ||||
| @@ -38,8 +38,10 @@ | |||||
| #include "libavutil/mathematics.h" | #include "libavutil/mathematics.h" | ||||
| #include "nellymoser.h" | #include "nellymoser.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "fft.h" | #include "fft.h" | ||||
| #include "internal.h" | |||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| #define BITSTREAM_WRITER_LE | #define BITSTREAM_WRITER_LE | ||||
| @@ -54,6 +56,7 @@ typedef struct NellyMoserEncodeContext { | |||||
| int last_frame; | int last_frame; | ||||
| DSPContext dsp; | DSPContext dsp; | ||||
| FFTContext mdct_ctx; | FFTContext mdct_ctx; | ||||
| AudioFrameQueue afq; | |||||
| DECLARE_ALIGNED(32, float, mdct_out)[NELLY_SAMPLES]; | DECLARE_ALIGNED(32, float, mdct_out)[NELLY_SAMPLES]; | ||||
| DECLARE_ALIGNED(32, float, in_buff)[NELLY_SAMPLES]; | DECLARE_ALIGNED(32, float, in_buff)[NELLY_SAMPLES]; | ||||
| DECLARE_ALIGNED(32, float, buf)[3 * NELLY_BUF_LEN]; ///< sample buffer | DECLARE_ALIGNED(32, float, buf)[3 * NELLY_BUF_LEN]; ///< sample buffer | ||||
| @@ -136,7 +139,10 @@ static av_cold int encode_end(AVCodecContext *avctx) | |||||
| av_free(s->opt); | av_free(s->opt); | ||||
| av_free(s->path); | av_free(s->path); | ||||
| } | } | ||||
| ff_af_queue_close(&s->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -161,6 +167,7 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| avctx->frame_size = NELLY_SAMPLES; | avctx->frame_size = NELLY_SAMPLES; | ||||
| avctx->delay = NELLY_BUF_LEN; | avctx->delay = NELLY_BUF_LEN; | ||||
| ff_af_queue_init(avctx, &s->afq); | |||||
| s->avctx = avctx; | s->avctx = avctx; | ||||
| if ((ret = ff_mdct_init(&s->mdct_ctx, 8, 0, 32768.0)) < 0) | if ((ret = ff_mdct_init(&s->mdct_ctx, 8, 0, 32768.0)) < 0) | ||||
| goto error; | goto error; | ||||
| @@ -180,11 +187,13 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| } | } | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -366,30 +375,44 @@ static void encode_block(NellyMoserEncodeContext *s, unsigned char *output, int | |||||
| memset(put_bits_ptr(&pb), 0, output + output_size - put_bits_ptr(&pb)); | memset(put_bits_ptr(&pb), 0, output + output_size - put_bits_ptr(&pb)); | ||||
| } | } | ||||
| static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, void *data) | |||||
| static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| NellyMoserEncodeContext *s = avctx->priv_data; | NellyMoserEncodeContext *s = avctx->priv_data; | ||||
| const float *samples = data; | |||||
| int ret; | |||||
| if (s->last_frame) | if (s->last_frame) | ||||
| return 0; | return 0; | ||||
| memcpy(s->buf, s->buf + NELLY_SAMPLES, NELLY_BUF_LEN * sizeof(*s->buf)); | memcpy(s->buf, s->buf + NELLY_SAMPLES, NELLY_BUF_LEN * sizeof(*s->buf)); | ||||
| if (data) { | |||||
| memcpy(s->buf + NELLY_BUF_LEN, samples, avctx->frame_size * sizeof(*s->buf)); | |||||
| if (avctx->frame_size < NELLY_SAMPLES) { | |||||
| if (frame) { | |||||
| memcpy(s->buf + NELLY_BUF_LEN, frame->data[0], | |||||
| frame->nb_samples * sizeof(*s->buf)); | |||||
| if (frame->nb_samples < NELLY_SAMPLES) { | |||||
| memset(s->buf + NELLY_BUF_LEN + avctx->frame_size, 0, | memset(s->buf + NELLY_BUF_LEN + avctx->frame_size, 0, | ||||
| (NELLY_SAMPLES - avctx->frame_size) * sizeof(*s->buf)); | |||||
| if (avctx->frame_size >= NELLY_BUF_LEN) | |||||
| (NELLY_SAMPLES - frame->nb_samples) * sizeof(*s->buf)); | |||||
| if (frame->nb_samples >= NELLY_BUF_LEN) | |||||
| s->last_frame = 1; | s->last_frame = 1; | ||||
| } | } | ||||
| if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) | |||||
| return ret; | |||||
| } else { | } else { | ||||
| memset(s->buf + NELLY_BUF_LEN, 0, NELLY_SAMPLES * sizeof(*s->buf)); | memset(s->buf + NELLY_BUF_LEN, 0, NELLY_SAMPLES * sizeof(*s->buf)); | ||||
| s->last_frame = 1; | s->last_frame = 1; | ||||
| } | } | ||||
| encode_block(s, frame, buf_size); | |||||
| return NELLY_BLOCK_LEN; | |||||
| if ((ret = ff_alloc_packet(avpkt, NELLY_BLOCK_LEN))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| encode_block(s, avpkt->data, avpkt->size); | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_nellymoser_encoder = { | AVCodec ff_nellymoser_encoder = { | ||||
| @@ -398,7 +421,7 @@ AVCodec ff_nellymoser_encoder = { | |||||
| .id = CODEC_ID_NELLYMOSER, | .id = CODEC_ID_NELLYMOSER, | ||||
| .priv_data_size = sizeof(NellyMoserEncodeContext), | .priv_data_size = sizeof(NellyMoserEncodeContext), | ||||
| .init = encode_init, | .init = encode_init, | ||||
| .encode = encode_frame, | |||||
| .encode2 = encode_frame, | |||||
| .close = encode_end, | .close = encode_end, | ||||
| .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"), | .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"), | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include "lpc.h" | #include "lpc.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #define NBLOCKS 4 ///< number of subblocks within a block | #define NBLOCKS 4 ///< number of subblocks within a block | ||||
| #define BLOCKSIZE 40 ///< subblock size in 16-bit words | #define BLOCKSIZE 40 ///< subblock size in 16-bit words | ||||
| @@ -36,6 +37,7 @@ typedef struct { | |||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| AVFrame frame; | AVFrame frame; | ||||
| LPCContext lpc_ctx; | LPCContext lpc_ctx; | ||||
| AudioFrameQueue afq; | |||||
| int last_frame; | int last_frame; | ||||
| unsigned int old_energy; ///< previous frame energy | unsigned int old_energy; ///< previous frame energy | ||||
| @@ -28,6 +28,8 @@ | |||||
| #include <float.h> | #include <float.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "audio_frame_queue.h" | |||||
| #include "internal.h" | |||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| #include "celp_filters.h" | #include "celp_filters.h" | ||||
| #include "ra144.h" | #include "ra144.h" | ||||
| @@ -37,7 +39,10 @@ static av_cold int ra144_encode_close(AVCodecContext *avctx) | |||||
| { | { | ||||
| RA144Context *ractx = avctx->priv_data; | RA144Context *ractx = avctx->priv_data; | ||||
| ff_lpc_end(&ractx->lpc_ctx); | ff_lpc_end(&ractx->lpc_ctx); | ||||
| ff_af_queue_close(&ractx->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -64,11 +69,15 @@ static av_cold int ra144_encode_init(AVCodecContext * avctx) | |||||
| if (ret < 0) | if (ret < 0) | ||||
| goto error; | goto error; | ||||
| ff_af_queue_init(avctx, &ractx->afq); | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = avcodec_alloc_frame(); | avctx->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -429,8 +438,8 @@ static void ra144_encode_subblock(RA144Context *ractx, | |||||
| } | } | ||||
| static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| int buf_size, void *data) | |||||
| static int ra144_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| static const uint8_t sizes[LPC_ORDER] = {64, 32, 32, 16, 16, 8, 8, 8, 8, 4}; | static const uint8_t sizes[LPC_ORDER] = {64, 32, 32, 16, 16, 8, 8, 8, 8, 4}; | ||||
| static const uint8_t bit_sizes[LPC_ORDER] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; | static const uint8_t bit_sizes[LPC_ORDER] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; | ||||
| @@ -442,16 +451,16 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| int16_t block_coefs[NBLOCKS][LPC_ORDER]; | int16_t block_coefs[NBLOCKS][LPC_ORDER]; | ||||
| int lpc_refl[LPC_ORDER]; /**< reflection coefficients of the frame */ | int lpc_refl[LPC_ORDER]; /**< reflection coefficients of the frame */ | ||||
| unsigned int refl_rms[NBLOCKS]; /**< RMS of the reflection coefficients */ | unsigned int refl_rms[NBLOCKS]; /**< RMS of the reflection coefficients */ | ||||
| const int16_t *samples = data; | |||||
| const int16_t *samples = frame ? (const int16_t *)frame->data[0] : NULL; | |||||
| int energy = 0; | int energy = 0; | ||||
| int i, idx; | |||||
| int i, idx, ret; | |||||
| if (ractx->last_frame) | if (ractx->last_frame) | ||||
| return 0; | return 0; | ||||
| if (buf_size < FRAMESIZE) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); | |||||
| return 0; | |||||
| if ((ret = ff_alloc_packet(avpkt, FRAMESIZE))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -465,9 +474,9 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| lpc_data[i] = ractx->curr_block[BLOCKSIZE + BLOCKSIZE / 2 + i]; | lpc_data[i] = ractx->curr_block[BLOCKSIZE + BLOCKSIZE / 2 + i]; | ||||
| energy += (lpc_data[i] * lpc_data[i]) >> 4; | energy += (lpc_data[i] * lpc_data[i]) >> 4; | ||||
| } | } | ||||
| if (data) { | |||||
| if (frame) { | |||||
| int j; | int j; | ||||
| for (j = 0; j < avctx->frame_size && i < NBLOCKS * BLOCKSIZE; i++, j++) { | |||||
| for (j = 0; j < frame->nb_samples && i < NBLOCKS * BLOCKSIZE; i++, j++) { | |||||
| lpc_data[i] = samples[j] >> 2; | lpc_data[i] = samples[j] >> 2; | ||||
| energy += (lpc_data[i] * lpc_data[i]) >> 4; | energy += (lpc_data[i] * lpc_data[i]) >> 4; | ||||
| } | } | ||||
| @@ -499,7 +508,7 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| memset(lpc_refl, 0, sizeof(lpc_refl)); | memset(lpc_refl, 0, sizeof(lpc_refl)); | ||||
| } | } | ||||
| } | } | ||||
| init_put_bits(&pb, frame, buf_size); | |||||
| init_put_bits(&pb, avpkt->data, avpkt->size); | |||||
| for (i = 0; i < LPC_ORDER; i++) { | for (i = 0; i < LPC_ORDER; i++) { | ||||
| idx = quantize(lpc_refl[i], ff_lpc_refl_cb[i], sizes[i]); | idx = quantize(lpc_refl[i], ff_lpc_refl_cb[i], sizes[i]); | ||||
| put_bits(&pb, bit_sizes[i], idx); | put_bits(&pb, bit_sizes[i], idx); | ||||
| @@ -525,15 +534,24 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| /* copy input samples to current block for processing in next call */ | /* copy input samples to current block for processing in next call */ | ||||
| i = 0; | i = 0; | ||||
| if (data) { | |||||
| for (; i < avctx->frame_size; i++) | |||||
| if (frame) { | |||||
| for (; i < frame->nb_samples; i++) | |||||
| ractx->curr_block[i] = samples[i] >> 2; | ractx->curr_block[i] = samples[i] >> 2; | ||||
| if ((ret = ff_af_queue_add(&ractx->afq, frame) < 0)) | |||||
| return ret; | |||||
| } else | } else | ||||
| ractx->last_frame = 1; | ractx->last_frame = 1; | ||||
| memset(&ractx->curr_block[i], 0, | memset(&ractx->curr_block[i], 0, | ||||
| (NBLOCKS * BLOCKSIZE - i) * sizeof(*ractx->curr_block)); | (NBLOCKS * BLOCKSIZE - i) * sizeof(*ractx->curr_block)); | ||||
| return FRAMESIZE; | |||||
| /* Get the next frame pts/duration */ | |||||
| ff_af_queue_remove(&ractx->afq, avctx->frame_size, &avpkt->pts, | |||||
| &avpkt->duration); | |||||
| avpkt->size = FRAMESIZE; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| @@ -543,7 +561,7 @@ AVCodec ff_ra_144_encoder = { | |||||
| .id = CODEC_ID_RA_144, | .id = CODEC_ID_RA_144, | ||||
| .priv_data_size = sizeof(RA144Context), | .priv_data_size = sizeof(RA144Context), | ||||
| .init = ra144_encode_init, | .init = ra144_encode_init, | ||||
| .encode = ra144_encode_frame, | |||||
| .encode2 = ra144_encode_frame, | |||||
| .close = ra144_encode_close, | .close = ra144_encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, | .capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, | .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include "libavutil/intmath.h" | #include "libavutil/intmath.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "internal.h" | |||||
| #define ROQ_FRAME_SIZE 735 | #define ROQ_FRAME_SIZE 735 | ||||
| #define ROQ_HEADER_SIZE 8 | #define ROQ_HEADER_SIZE 8 | ||||
| @@ -37,6 +38,7 @@ typedef struct | |||||
| int input_frames; | int input_frames; | ||||
| int buffered_samples; | int buffered_samples; | ||||
| int16_t *frame_buffer; | int16_t *frame_buffer; | ||||
| int64_t first_pts; | |||||
| } ROQDPCMContext; | } ROQDPCMContext; | ||||
| @@ -44,7 +46,9 @@ static av_cold int roq_dpcm_encode_close(AVCodecContext *avctx) | |||||
| { | { | ||||
| ROQDPCMContext *context = avctx->priv_data; | ROQDPCMContext *context = avctx->priv_data; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avctx->coded_frame); | av_freep(&avctx->coded_frame); | ||||
| #endif | |||||
| av_freep(&context->frame_buffer); | av_freep(&context->frame_buffer); | ||||
| return 0; | return 0; | ||||
| @@ -77,11 +81,13 @@ static av_cold int roq_dpcm_encode_init(AVCodecContext *avctx) | |||||
| context->lastSample[0] = context->lastSample[1] = 0; | context->lastSample[0] = context->lastSample[1] = 0; | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame= avcodec_alloc_frame(); | avctx->coded_frame= avcodec_alloc_frame(); | ||||
| if (!avctx->coded_frame) { | if (!avctx->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -129,23 +135,25 @@ static unsigned char dpcm_predict(short *previous, short current) | |||||
| return result; | return result; | ||||
| } | } | ||||
| static int roq_dpcm_encode_frame(AVCodecContext *avctx, | |||||
| unsigned char *frame, int buf_size, void *data) | |||||
| static int roq_dpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| int i, stereo, data_size; | |||||
| const int16_t *in = data; | |||||
| uint8_t *out = frame; | |||||
| int i, stereo, data_size, ret; | |||||
| const int16_t *in = frame ? (const int16_t *)frame->data[0] : NULL; | |||||
| uint8_t *out; | |||||
| ROQDPCMContext *context = avctx->priv_data; | ROQDPCMContext *context = avctx->priv_data; | ||||
| stereo = (avctx->channels == 2); | stereo = (avctx->channels == 2); | ||||
| if (!data && context->input_frames >= 8) | |||||
| if (!in && context->input_frames >= 8) | |||||
| return 0; | return 0; | ||||
| if (data && context->input_frames < 8) { | |||||
| if (in && context->input_frames < 8) { | |||||
| memcpy(&context->frame_buffer[context->buffered_samples * avctx->channels], | memcpy(&context->frame_buffer[context->buffered_samples * avctx->channels], | ||||
| in, avctx->frame_size * avctx->channels * sizeof(*in)); | in, avctx->frame_size * avctx->channels * sizeof(*in)); | ||||
| context->buffered_samples += avctx->frame_size; | context->buffered_samples += avctx->frame_size; | ||||
| if (context->input_frames == 0) | |||||
| context->first_pts = frame->pts; | |||||
| if (context->input_frames < 7) { | if (context->input_frames < 7) { | ||||
| context->input_frames++; | context->input_frames++; | ||||
| return 0; | return 0; | ||||
| @@ -158,15 +166,16 @@ static int roq_dpcm_encode_frame(AVCodecContext *avctx, | |||||
| context->lastSample[1] &= 0xFF00; | context->lastSample[1] &= 0xFF00; | ||||
| } | } | ||||
| if (context->input_frames == 7 || !data) | |||||
| if (context->input_frames == 7 || !in) | |||||
| data_size = avctx->channels * context->buffered_samples; | data_size = avctx->channels * context->buffered_samples; | ||||
| else | else | ||||
| data_size = avctx->channels * avctx->frame_size; | data_size = avctx->channels * avctx->frame_size; | ||||
| if (buf_size < ROQ_HEADER_SIZE + data_size) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); | |||||
| return AVERROR(EINVAL); | |||||
| if ((ret = ff_alloc_packet(avpkt, ROQ_HEADER_SIZE + data_size))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | } | ||||
| out = avpkt->data; | |||||
| bytestream_put_byte(&out, stereo ? 0x21 : 0x20); | bytestream_put_byte(&out, stereo ? 0x21 : 0x20); | ||||
| bytestream_put_byte(&out, 0x10); | bytestream_put_byte(&out, 0x10); | ||||
| @@ -182,12 +191,15 @@ static int roq_dpcm_encode_frame(AVCodecContext *avctx, | |||||
| for (i = 0; i < data_size; i++) | for (i = 0; i < data_size; i++) | ||||
| *out++ = dpcm_predict(&context->lastSample[i & 1], *in++); | *out++ = dpcm_predict(&context->lastSample[i & 1], *in++); | ||||
| avpkt->pts = context->input_frames <= 7 ? context->first_pts : frame->pts; | |||||
| avpkt->duration = data_size / avctx->channels; | |||||
| context->input_frames++; | context->input_frames++; | ||||
| if (!data) | |||||
| if (!in) | |||||
| context->input_frames = FFMAX(context->input_frames, 8); | context->input_frames = FFMAX(context->input_frames, 8); | ||||
| /* Return the result size */ | |||||
| return ROQ_HEADER_SIZE + data_size; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_roq_dpcm_encoder = { | AVCodec ff_roq_dpcm_encoder = { | ||||
| @@ -196,7 +208,7 @@ AVCodec ff_roq_dpcm_encoder = { | |||||
| .id = CODEC_ID_ROQ_DPCM, | .id = CODEC_ID_ROQ_DPCM, | ||||
| .priv_data_size = sizeof(ROQDPCMContext), | .priv_data_size = sizeof(ROQDPCMContext), | ||||
| .init = roq_dpcm_encode_init, | .init = roq_dpcm_encode_init, | ||||
| .encode = roq_dpcm_encode_frame, | |||||
| .encode2 = roq_dpcm_encode_frame, | |||||
| .close = roq_dpcm_encode_close, | .close = roq_dpcm_encode_close, | ||||
| .capabilities = CODEC_CAP_DELAY, | .capabilities = CODEC_CAP_DELAY, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include <float.h> | #include <float.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "internal.h" | |||||
| #include "fft.h" | #include "fft.h" | ||||
| #include "vorbis.h" | #include "vorbis.h" | ||||
| #include "vorbis_enc_data.h" | #include "vorbis_enc_data.h" | ||||
| @@ -123,7 +124,7 @@ typedef struct { | |||||
| int nmodes; | int nmodes; | ||||
| vorbis_enc_mode *modes; | vorbis_enc_mode *modes; | ||||
| int64_t sample_count; | |||||
| int64_t next_pts; | |||||
| } vorbis_enc_context; | } vorbis_enc_context; | ||||
| #define MAX_CHANNELS 2 | #define MAX_CHANNELS 2 | ||||
| @@ -1014,23 +1015,27 @@ static int apply_window_and_mdct(vorbis_enc_context *venc, const signed short *a | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| static int vorbis_encode_frame(AVCodecContext *avccontext, | |||||
| unsigned char *packets, | |||||
| int buf_size, void *data) | |||||
| static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | { | ||||
| vorbis_enc_context *venc = avccontext->priv_data; | vorbis_enc_context *venc = avccontext->priv_data; | ||||
| const signed short *audio = data; | |||||
| int samples = data ? avccontext->frame_size : 0; | |||||
| const int16_t *audio = frame ? (const int16_t *)frame->data[0] : NULL; | |||||
| int samples = frame ? frame->nb_samples : 0; | |||||
| vorbis_enc_mode *mode; | vorbis_enc_mode *mode; | ||||
| vorbis_enc_mapping *mapping; | vorbis_enc_mapping *mapping; | ||||
| PutBitContext pb; | PutBitContext pb; | ||||
| int i; | |||||
| int i, ret; | |||||
| if (!apply_window_and_mdct(venc, audio, samples)) | if (!apply_window_and_mdct(venc, audio, samples)) | ||||
| return 0; | return 0; | ||||
| samples = 1 << (venc->log2_blocksize[0] - 1); | samples = 1 << (venc->log2_blocksize[0] - 1); | ||||
| init_put_bits(&pb, packets, buf_size); | |||||
| if ((ret = ff_alloc_packet(avpkt, 8192))) { | |||||
| av_log(avccontext, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | |||||
| init_put_bits(&pb, avpkt->data, avpkt->size); | |||||
| if (pb.size_in_bits - put_bits_count(&pb) < 1 + ilog(venc->nmodes - 1)) { | if (pb.size_in_bits - put_bits_count(&pb) < 1 + ilog(venc->nmodes - 1)) { | ||||
| av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n"); | av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n"); | ||||
| @@ -1081,10 +1086,20 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, | |||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| avccontext->coded_frame->pts = venc->sample_count; | |||||
| venc->sample_count += avccontext->frame_size; | |||||
| flush_put_bits(&pb); | flush_put_bits(&pb); | ||||
| return put_bits_count(&pb) >> 3; | |||||
| avpkt->size = put_bits_count(&pb) >> 3; | |||||
| avpkt->duration = ff_samples_to_time_base(avccontext, avccontext->frame_size); | |||||
| if (frame) | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = ff_samples_to_time_base(avccontext, frame->pts); | |||||
| else | |||||
| avpkt->pts = venc->next_pts; | |||||
| if (avpkt->pts != AV_NOPTS_VALUE) | |||||
| venc->next_pts = avpkt->pts + avpkt->duration; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| @@ -1142,7 +1157,9 @@ static av_cold int vorbis_encode_close(AVCodecContext *avccontext) | |||||
| ff_mdct_end(&venc->mdct[0]); | ff_mdct_end(&venc->mdct[0]); | ||||
| ff_mdct_end(&venc->mdct[1]); | ff_mdct_end(&venc->mdct[1]); | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| av_freep(&avccontext->coded_frame); | av_freep(&avccontext->coded_frame); | ||||
| #endif | |||||
| av_freep(&avccontext->extradata); | av_freep(&avccontext->extradata); | ||||
| return 0 ; | return 0 ; | ||||
| @@ -1173,11 +1190,13 @@ static av_cold int vorbis_encode_init(AVCodecContext *avccontext) | |||||
| avccontext->frame_size = 1 << (venc->log2_blocksize[0] - 1); | avccontext->frame_size = 1 << (venc->log2_blocksize[0] - 1); | ||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avccontext->coded_frame = avcodec_alloc_frame(); | avccontext->coded_frame = avcodec_alloc_frame(); | ||||
| if (!avccontext->coded_frame) { | if (!avccontext->coded_frame) { | ||||
| ret = AVERROR(ENOMEM); | ret = AVERROR(ENOMEM); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -1191,7 +1210,7 @@ AVCodec ff_vorbis_encoder = { | |||||
| .id = CODEC_ID_VORBIS, | .id = CODEC_ID_VORBIS, | ||||
| .priv_data_size = sizeof(vorbis_enc_context), | .priv_data_size = sizeof(vorbis_enc_context), | ||||
| .init = vorbis_encode_init, | .init = vorbis_encode_init, | ||||
| .encode = vorbis_encode_frame, | |||||
| .encode2 = vorbis_encode_frame, | |||||
| .close = vorbis_encode_close, | .close = vorbis_encode_close, | ||||
| .capabilities= CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, | .capabilities= CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| @@ -20,6 +20,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | |||||
| #include "wma.h" | #include "wma.h" | ||||
| #include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
| @@ -87,7 +88,12 @@ static int encode_init(AVCodecContext * avctx){ | |||||
| avctx->bit_rate = avctx->block_align * 8LL * avctx->sample_rate / | avctx->bit_rate = avctx->block_align * 8LL * avctx->sample_rate / | ||||
| s->frame_len; | s->frame_len; | ||||
| //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d\n", s->block_align, avctx->bit_rate, s->frame_len, avctx->sample_rate); | //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d\n", s->block_align, avctx->bit_rate, s->frame_len, avctx->sample_rate); | ||||
| avctx->frame_size= s->frame_len; | |||||
| avctx->frame_size = avctx->delay = s->frame_len; | |||||
| #if FF_API_OLD_ENCODE_AUDIO | |||||
| avctx->coded_frame = &s->frame; | |||||
| avcodec_get_frame_defaults(avctx->coded_frame); | |||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -341,16 +347,17 @@ static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], | |||||
| return put_bits_count(&s->pb)/8 - s->block_align; | return put_bits_count(&s->pb)/8 - s->block_align; | ||||
| } | } | ||||
| static int encode_superframe(AVCodecContext *avctx, | |||||
| unsigned char *buf, int buf_size, void *data){ | |||||
| static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| const AVFrame *frame, int *got_packet_ptr) | |||||
| { | |||||
| WMACodecContext *s = avctx->priv_data; | WMACodecContext *s = avctx->priv_data; | ||||
| const short *samples = data; | |||||
| int i, total_gain; | |||||
| const int16_t *samples = (const int16_t *)frame->data[0]; | |||||
| int i, total_gain, ret; | |||||
| s->block_len_bits= s->frame_len_bits; //required by non variable block len | s->block_len_bits= s->frame_len_bits; //required by non variable block len | ||||
| s->block_len = 1 << s->block_len_bits; | s->block_len = 1 << s->block_len_bits; | ||||
| apply_window_and_mdct(avctx, samples, avctx->frame_size); | |||||
| apply_window_and_mdct(avctx, samples, frame->nb_samples); | |||||
| if (s->ms_stereo) { | if (s->ms_stereo) { | ||||
| float a, b; | float a, b; | ||||
| @@ -364,24 +371,25 @@ static int encode_superframe(AVCodecContext *avctx, | |||||
| } | } | ||||
| } | } | ||||
| if (buf_size < 2 * MAX_CODED_SUPERFRAME_SIZE) { | |||||
| av_log(avctx, AV_LOG_ERROR, "output buffer size is too small\n"); | |||||
| return AVERROR(EINVAL); | |||||
| if ((ret = ff_alloc_packet(avpkt, 2 * MAX_CODED_SUPERFRAME_SIZE))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); | |||||
| return ret; | |||||
| } | } | ||||
| #if 1 | #if 1 | ||||
| total_gain= 128; | total_gain= 128; | ||||
| for(i=64; i; i>>=1){ | for(i=64; i; i>>=1){ | ||||
| int error= encode_frame(s, s->coefs, buf, buf_size, total_gain-i); | |||||
| int error = encode_frame(s, s->coefs, avpkt->data, avpkt->size, | |||||
| total_gain - i); | |||||
| if(error<0) | if(error<0) | ||||
| total_gain-= i; | total_gain-= i; | ||||
| } | } | ||||
| #else | #else | ||||
| total_gain= 90; | total_gain= 90; | ||||
| best= encode_frame(s, s->coefs, buf, buf_size, total_gain); | |||||
| best = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain); | |||||
| for(i=32; i; i>>=1){ | for(i=32; i; i>>=1){ | ||||
| int scoreL= encode_frame(s, s->coefs, buf, buf_size, total_gain-i); | |||||
| int scoreR= encode_frame(s, s->coefs, buf, buf_size, total_gain+i); | |||||
| int scoreL = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain - i); | |||||
| int scoreR = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain + i); | |||||
| av_log(NULL, AV_LOG_ERROR, "%d %d %d (%d)\n", scoreL, best, scoreR, total_gain); | av_log(NULL, AV_LOG_ERROR, "%d %d %d (%d)\n", scoreL, best, scoreR, total_gain); | ||||
| if(scoreL < FFMIN(best, scoreR)){ | if(scoreL < FFMIN(best, scoreR)){ | ||||
| best = scoreL; | best = scoreL; | ||||
| @@ -393,7 +401,7 @@ static int encode_superframe(AVCodecContext *avctx, | |||||
| } | } | ||||
| #endif | #endif | ||||
| encode_frame(s, s->coefs, buf, buf_size, total_gain); | |||||
| encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain); | |||||
| av_assert0((put_bits_count(&s->pb) & 7) == 0); | av_assert0((put_bits_count(&s->pb) & 7) == 0); | ||||
| i= s->block_align - (put_bits_count(&s->pb)+7)/8; | i= s->block_align - (put_bits_count(&s->pb)+7)/8; | ||||
| av_assert0(i>=0); | av_assert0(i>=0); | ||||
| @@ -402,7 +410,13 @@ static int encode_superframe(AVCodecContext *avctx, | |||||
| flush_put_bits(&s->pb); | flush_put_bits(&s->pb); | ||||
| av_assert0(put_bits_ptr(&s->pb) - s->pb.buf == s->block_align); | av_assert0(put_bits_ptr(&s->pb) - s->pb.buf == s->block_align); | ||||
| return s->block_align; | |||||
| if (frame->pts != AV_NOPTS_VALUE) | |||||
| avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); | |||||
| avpkt->size = s->block_align; | |||||
| *got_packet_ptr = 1; | |||||
| return 0; | |||||
| } | } | ||||
| AVCodec ff_wmav1_encoder = { | AVCodec ff_wmav1_encoder = { | ||||
| @@ -411,7 +425,7 @@ AVCodec ff_wmav1_encoder = { | |||||
| .id = CODEC_ID_WMAV1, | .id = CODEC_ID_WMAV1, | ||||
| .priv_data_size = sizeof(WMACodecContext), | .priv_data_size = sizeof(WMACodecContext), | ||||
| .init = encode_init, | .init = encode_init, | ||||
| .encode = encode_superframe, | |||||
| .encode2 = encode_superframe, | |||||
| .close = ff_wma_end, | .close = ff_wma_end, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), | .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), | ||||
| @@ -423,7 +437,7 @@ AVCodec ff_wmav2_encoder = { | |||||
| .id = CODEC_ID_WMAV2, | .id = CODEC_ID_WMAV2, | ||||
| .priv_data_size = sizeof(WMACodecContext), | .priv_data_size = sizeof(WMACodecContext), | ||||
| .init = encode_init, | .init = encode_init, | ||||
| .encode = encode_superframe, | |||||
| .encode2 = encode_superframe, | |||||
| .close = ff_wma_end, | .close = ff_wma_end, | ||||
| .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), | .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), | ||||
| @@ -1,4 +1,4 @@ | |||||
| d1a10c4d35f752f60798114a156be3a8 *./tests/data/acodec/g722.wav | |||||
| e4d5ae038f29659c03fcf68818f7be6c *./tests/data/acodec/g722.wav | |||||
| 48053 ./tests/data/acodec/g722.wav | 48053 ./tests/data/acodec/g722.wav | ||||
| 8dafe5b74ccd5f08fed2fb2a69c5475f *./tests/data/g722.acodec.out.wav | 8dafe5b74ccd5f08fed2fb2a69c5475f *./tests/data/g722.acodec.out.wav | ||||
| stddev: 8939.47 PSNR: 17.30 MAXDIFF:40370 bytes: 191980/ 1058400 | stddev: 8939.47 PSNR: 17.30 MAXDIFF:40370 bytes: 191980/ 1058400 | ||||
| @@ -1,3 +1,3 @@ | |||||
| 3d410176ebf9ffdf99d2738922cef260 *./tests/data/lavf/lavf.asf | |||||
| e60b298a4db9bcedaabaaee9f90d2a42 *./tests/data/lavf/lavf.asf | |||||
| 333489 ./tests/data/lavf/lavf.asf | 333489 ./tests/data/lavf/lavf.asf | ||||
| ./tests/data/lavf/lavf.asf CRC=0x9f5ab3e6 | ./tests/data/lavf/lavf.asf CRC=0x9f5ab3e6 | ||||
| @@ -1,3 +1,3 @@ | |||||
| 8ce2ea9a73a1187647df7bf3c8e1b8fd *./tests/data/lavf/lavf.ffm | |||||
| 793e977bc8b7f0d86f785a9062c4d978 *./tests/data/lavf/lavf.ffm | |||||
| 376832 ./tests/data/lavf/lavf.ffm | 376832 ./tests/data/lavf/lavf.ffm | ||||
| ./tests/data/lavf/lavf.ffm CRC=0xf361ed74 | ./tests/data/lavf/lavf.ffm CRC=0xf361ed74 | ||||
| @@ -1,3 +1,3 @@ | |||||
| f99ae18e1212ee184188243107a4b824 *./tests/data/lavf/lavf.mkv | |||||
| 19c989b2a18dc352ede9754af5fcb5f2 *./tests/data/lavf/lavf.mkv | |||||
| 320521 ./tests/data/lavf/lavf.mkv | 320521 ./tests/data/lavf/lavf.mkv | ||||
| ./tests/data/lavf/lavf.mkv CRC=0x2a83e6b0 | |||||
| ./tests/data/lavf/lavf.mkv CRC=0x5b4ae6b0 | |||||
| @@ -1,9 +1,9 @@ | |||||
| 6103dbae73aec6c9bf05bbbc6ea35f89 *./tests/data/lavf/lavf.mpg | |||||
| 855384c0cd3d0e3843d48698441c1384 *./tests/data/lavf/lavf.mpg | |||||
| 372736 ./tests/data/lavf/lavf.mpg | 372736 ./tests/data/lavf/lavf.mpg | ||||
| ./tests/data/lavf/lavf.mpg CRC=0xf361ed74 | ./tests/data/lavf/lavf.mpg CRC=0xf361ed74 | ||||
| 91b42dd3352e21dd0dee57f6a7241ca2 *./tests/data/lavf/lavf.mpg | |||||
| 612b686e2c035b18175ccefdacf9532c *./tests/data/lavf/lavf.mpg | |||||
| 387072 ./tests/data/lavf/lavf.mpg | 387072 ./tests/data/lavf/lavf.mpg | ||||
| ./tests/data/lavf/lavf.mpg CRC=0x3d6ddf56 | ./tests/data/lavf/lavf.mpg CRC=0x3d6ddf56 | ||||
| dd60652c2193670abffb8c2a123a820e *./tests/data/lavf/lavf.mpg | |||||
| fcf2c242b41373186d43de3d5c518e5a *./tests/data/lavf/lavf.mpg | |||||
| 372736 ./tests/data/lavf/lavf.mpg | 372736 ./tests/data/lavf/lavf.mpg | ||||
| ./tests/data/lavf/lavf.mpg CRC=0xf361ed74 | ./tests/data/lavf/lavf.mpg CRC=0xf361ed74 | ||||
| @@ -1,2 +1,2 @@ | |||||
| 2b0eebb5814825c9c4b385cbf8e5b0da *./tests/data/lavf/lavf.rm | |||||
| be73bce6e371fd543f93f668406f3430 *./tests/data/lavf/lavf.rm | |||||
| 346714 ./tests/data/lavf/lavf.rm | 346714 ./tests/data/lavf/lavf.rm | ||||
| @@ -1,3 +1,3 @@ | |||||
| 34f95a300355d474767b436430eba15b *./tests/data/lavf/lavf.ts | |||||
| 258a64dbc1724438e90560294be4be5c *./tests/data/lavf/lavf.ts | |||||
| 406644 ./tests/data/lavf/lavf.ts | 406644 ./tests/data/lavf/lavf.ts | ||||
| ./tests/data/lavf/lavf.ts CRC=0x133216c1 | ./tests/data/lavf/lavf.ts CRC=0x133216c1 | ||||
| @@ -1,3 +1,3 @@ | |||||
| 7bd312f32538a14f248c2dff85394118 *./tests/data/lavf/lavf.wtv | |||||
| de9c3be54bafeba1b7f9618609bd0f62 *./tests/data/lavf/lavf.wtv | |||||
| 413696 ./tests/data/lavf/lavf.wtv | 413696 ./tests/data/lavf/lavf.wtv | ||||
| ./tests/data/lavf/lavf.wtv CRC=0x133216c1 | ./tests/data/lavf/lavf.wtv CRC=0x133216c1 | ||||
| @@ -1,53 +1,53 @@ | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts: 0.788000 | ret: 0 st: 0 flags:0 ts: 0.788000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317000 | ret: 0 st: 0 flags:1 ts:-0.317000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st: 1 flags:0 ts: 2.577000 | ret: 0 st: 1 flags:0 ts: 2.577000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.471000 | ret: 0 st: 1 flags:1 ts: 1.471000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.459000 pts: 0.459000 pos: 147889 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st: 0 flags:0 ts: 2.153000 | ret: 0 st: 0 flags:0 ts: 2.153000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts: 1.048000 | ret: 0 st: 0 flags:1 ts: 1.048000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:0 ts:-0.058000 | ret: 0 st: 1 flags:0 ts:-0.058000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 29489 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st: 1 flags:1 ts: 2.836000 | ret: 0 st: 1 flags:1 ts: 2.836000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.459000 pts: 0.459000 pos: 147889 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts:-0.482000 | ret: 0 st: 0 flags:0 ts:-0.482000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st: 0 flags:1 ts: 2.413000 | ret: 0 st: 0 flags:1 ts: 2.413000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:0 ts: 1.307000 | ret: 0 st: 1 flags:0 ts: 1.307000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 0.201000 | ret: 0 st: 1 flags:1 ts: 0.201000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.183000 pts: 0.183000 pos: 71089 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.198000 pts: 0.198000 pos: 74289 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts: 0.883000 | ret: 0 st: 0 flags:0 ts: 0.883000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.930000 pts: 0.930000 pos: 301489 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222000 | ret: 0 st: 0 flags:1 ts:-0.222000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| ret: 0 st: 1 flags:0 ts: 2.672000 | ret: 0 st: 1 flags:0 ts: 2.672000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.566000 | ret: 0 st: 1 flags:1 ts: 1.566000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 330289 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.459000 pts: 0.459000 pos: 147889 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 689 size: 208 | |||||
| @@ -2,52 +2,52 @@ ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts: 0.788334 | ret: 0 st: 0 flags:0 ts: 0.788334 | ||||
| ret: 0 st: 1 flags:1 dts: 0.809796 pts: 0.809796 pos: 327680 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.825011 pts: 0.825011 pos: 327680 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317499 | ret: 0 st: 0 flags:1 ts:-0.317499 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st: 1 flags:0 ts: 2.576668 | ret: 0 st: 1 flags:0 ts: 2.576668 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.470835 | ret: 0 st: 1 flags:1 ts: 1.470835 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 1 flags:1 dts: 0.365714 pts: 0.365714 pos: 163840 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.380930 pts: 0.380930 pos: 167936 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st: 0 flags:0 ts: 2.153336 | ret: 0 st: 0 flags:0 ts: 2.153336 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts: 1.047503 | ret: 0 st: 0 flags:1 ts: 1.047503 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:0 ts:-0.058330 | ret: 0 st: 1 flags:0 ts:-0.058330 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st: 1 flags:1 ts: 2.835837 | ret: 0 st: 1 flags:1 ts: 2.835837 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 1 flags:1 dts: 0.653061 pts: 0.653061 pos: 274432 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.642154 pts: 0.642154 pos: 274432 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts:-0.481662 | ret: 0 st: 0 flags:0 ts:-0.481662 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st: 0 flags:1 ts: 2.412505 | ret: 0 st: 0 flags:1 ts: 2.412505 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:0 ts: 1.306672 | ret: 0 st: 1 flags:0 ts: 1.306672 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 0.200839 | ret: 0 st: 1 flags:1 ts: 0.200839 | ||||
| ret: 0 st: 1 flags:1 dts: 0.208980 pts: 0.208980 pos: 114688 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.224195 pts: 0.224195 pos: 114688 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts: 0.883340 | ret: 0 st: 0 flags:0 ts: 0.883340 | ||||
| ret: 0 st: 1 flags:1 dts: 0.888163 pts: 0.888163 pos: 352256 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.877256 pts: 0.877256 pos: 339968 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222493 | ret: 0 st: 0 flags:1 ts:-0.222493 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| ret: 0 st: 1 flags:0 ts: 2.671674 | ret: 0 st: 1 flags:0 ts: 2.671674 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.565841 | ret: 0 st: 1 flags:1 ts: 1.565841 | ||||
| ret: 0 st: 1 flags:1 dts: 0.940408 pts: 0.940408 pos: 376832 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.929501 pts: 0.929501 pos: 376832 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 1 flags:1 dts: 0.496327 pts: 0.496327 pos: 221184 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.485420 pts: 0.485420 pos: 221184 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 8192 size: 24664 | ||||
| @@ -1,48 +1,48 @@ | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 555 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret: 0 st: 0 flags:0 ts: 0.788000 | ret: 0 st: 0 flags:0 ts: 0.788000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317000 | ret: 0 st: 0 flags:1 ts:-0.317000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret:-1 st: 1 flags:0 ts: 2.577000 | ret:-1 st: 1 flags:0 ts: 2.577000 | ||||
| ret: 0 st: 1 flags:1 ts: 1.471000 | ret: 0 st: 1 flags:1 ts: 1.471000 | ||||
| ret: 0 st: 1 flags:1 dts: 1.019000 pts: 1.019000 pos: 320250 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 1.008000 pts: 1.008000 pos: 320250 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret:-1 st: 0 flags:0 ts: 2.153000 | ret:-1 st: 0 flags:0 ts: 2.153000 | ||||
| ret: 0 st: 0 flags:1 ts: 1.048000 | ret: 0 st: 0 flags:1 ts: 1.048000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret: 0 st: 1 flags:0 ts:-0.058000 | ret: 0 st: 1 flags:0 ts:-0.058000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.015000 pts: 0.015000 pos: 555 size: 208 | |||||
| ret: 0 st: 1 flags:1 ts: 2.836000 | ret: 0 st: 1 flags:1 ts: 2.836000 | ||||
| ret: 0 st: 1 flags:1 dts: 1.019000 pts: 1.019000 pos: 320250 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 1.008000 pts: 1.008000 pos: 320250 size: 209 | |||||
| ret:-1 st:-1 flags:0 ts: 1.730004 | ret:-1 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ||||
| ret: 0 st: 0 flags:0 ts:-0.482000 | ret: 0 st: 0 flags:0 ts:-0.482000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret: 0 st: 0 flags:1 ts: 2.413000 | ret: 0 st: 0 flags:1 ts: 2.413000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret:-1 st: 1 flags:0 ts: 1.307000 | ret:-1 st: 1 flags:0 ts: 1.307000 | ||||
| ret: 0 st: 1 flags:1 ts: 0.201000 | ret: 0 st: 1 flags:1 ts: 0.201000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.183000 pts: 0.183000 pos: 72126 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.198000 pts: 0.198000 pos: 555 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret: 0 st: 0 flags:0 ts: 0.883000 | ret: 0 st: 0 flags:0 ts: 0.883000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 291977 size: 27834 | |||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222000 | ret: 0 st: 0 flags:1 ts:-0.222000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| ret:-1 st: 1 flags:0 ts: 2.672000 | ret:-1 st: 1 flags:0 ts: 2.672000 | ||||
| ret: 0 st: 1 flags:1 ts: 1.566000 | ret: 0 st: 1 flags:1 ts: 1.566000 | ||||
| ret: 0 st: 1 flags:1 dts: 1.019000 pts: 1.019000 pos: 320250 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 1.008000 pts: 1.008000 pos: 320250 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146746 size: 27925 | ||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 556 size: 27837 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 | |||||
| @@ -1,53 +1,53 @@ | |||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 0 flags:0 dts: 1.880000 pts: 1.920000 pos: 327680 size: 12894 | ret: 0 st: 0 flags:0 dts: 1.880000 pts: 1.920000 pos: 327680 size: 12894 | ||||
| ret: 0 st: 0 flags:0 ts: 0.788333 | ret: 0 st: 0 flags:0 ts: 0.788333 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317500 | ret: 0 st: 0 flags:1 ts:-0.317500 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:0 ts: 2.576667 | ret: 0 st: 1 flags:0 ts: 2.576667 | ||||
| ret: 0 st: 1 flags:1 dts: 2.018778 pts: 2.018778 pos: 370700 size: 235 | |||||
| ret: 0 st: 1 flags:1 dts: 2.007867 pts: 2.007867 pos: 370700 size: 235 | |||||
| ret: 0 st: 1 flags:1 ts: 1.470833 | ret: 0 st: 1 flags:1 ts: 1.470833 | ||||
| ret: 0 st: 1 flags:1 dts: 1.261222 pts: 1.261222 pos: 145408 size: 261 | |||||
| ret: 0 st: 1 flags:1 dts: 1.250322 pts: 1.250322 pos: 145408 size: 261 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 0 flags:0 ts: 2.153333 | ret: 0 st: 0 flags:0 ts: 2.153333 | ||||
| ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ||||
| ret: 0 st: 0 flags:1 ts: 1.047500 | ret: 0 st: 0 flags:1 ts: 1.047500 | ||||
| ret: 0 st: 0 flags:0 dts: 1.040000 pts: 1.080000 pos: 40960 size: 16073 | ret: 0 st: 0 flags:0 dts: 1.040000 pts: 1.080000 pos: 40960 size: 16073 | ||||
| ret: 0 st: 1 flags:0 ts:-0.058333 | ret: 0 st: 1 flags:0 ts:-0.058333 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 ts: 2.835833 | ret: 0 st: 1 flags:1 ts: 2.835833 | ||||
| ret: 0 st: 1 flags:1 dts: 2.018778 pts: 2.018778 pos: 370700 size: 235 | |||||
| ret: 0 st: 1 flags:1 dts: 2.007867 pts: 2.007867 pos: 370700 size: 235 | |||||
| ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st: 0 flags:0 dts: 1.760000 pts: 1.800000 pos: 292864 size: 13170 | ret: 0 st: 0 flags:0 dts: 1.760000 pts: 1.800000 pos: 292864 size: 13170 | ||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 0 flags:0 ts:-0.481667 | ret: 0 st: 0 flags:0 ts:-0.481667 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 0 flags:1 ts: 2.412500 | ret: 0 st: 0 flags:1 ts: 2.412500 | ||||
| ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ||||
| ret: 0 st: 1 flags:0 ts: 1.306667 | ret: 0 st: 1 flags:0 ts: 1.306667 | ||||
| ret: 0 st: 1 flags:1 dts: 1.522444 pts: 1.522444 pos: 342028 size: 314 | |||||
| ret: 0 st: 1 flags:1 dts: 1.511544 pts: 1.511544 pos: 342028 size: 314 | |||||
| ret: 0 st: 1 flags:1 ts: 0.200844 | ret: 0 st: 1 flags:1 ts: 0.200844 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ret: 0 st: 0 flags:0 dts: 1.920000 pts: 1.960000 pos: 339968 size: 681 | ||||
| ret: 0 st: 0 flags:0 ts: 0.883344 | ret: 0 st: 0 flags:0 ts: 0.883344 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222489 | ret: 0 st: 0 flags:1 ts:-0.222489 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:0 ts: 2.671678 | ret: 0 st: 1 flags:0 ts: 2.671678 | ||||
| ret: 0 st: 1 flags:1 dts: 2.018778 pts: 2.018778 pos: 370700 size: 235 | |||||
| ret: 0 st: 1 flags:1 dts: 2.007867 pts: 2.007867 pos: 370700 size: 235 | |||||
| ret: 0 st: 1 flags:1 ts: 1.565844 | ret: 0 st: 1 flags:1 ts: 1.565844 | ||||
| ret: 0 st: 1 flags:1 dts: 1.522444 pts: 1.522444 pos: 342028 size: 314 | |||||
| ret: 0 st: 1 flags:1 dts: 1.511544 pts: 1.511544 pos: 342028 size: 314 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 1 flags:1 dts: 1.000000 pts: 1.000000 pos: 2048 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 0.989089 pts: 0.989089 pos: 2048 size: 208 | |||||
| @@ -1,12 +1,12 @@ | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 395 size: 278 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 0 flags:0 ts: 0.788000 | ret: 0 st: 0 flags:0 ts: 0.788000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 0 flags:1 ts:-0.317000 | ret: 0 st: 0 flags:1 ts:-0.317000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st: 1 flags:0 ts: 2.577000 | ret: 0 st: 1 flags:0 ts: 2.577000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ||||
| ret: 0 st: 1 flags:1 ts: 1.471000 | ret: 0 st: 1 flags:1 ts: 1.471000 | ||||
| @@ -14,13 +14,13 @@ ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st: 0 flags:0 ts: 2.153000 | ret: 0 st: 0 flags:0 ts: 2.153000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 0 flags:1 ts: 1.048000 | ret: 0 st: 0 flags:1 ts: 1.048000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 1 flags:0 ts:-0.058000 | ret: 0 st: 1 flags:0 ts:-0.058000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 31491 size: 278 | |||||
| ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 395 size: 278 | |||||
| ret: 0 st: 1 flags:1 ts: 2.836000 | ret: 0 st: 1 flags:1 ts: 2.836000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ||||
| ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
| @@ -28,7 +28,7 @@ ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | |||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ||||
| ret: 0 st: 0 flags:0 ts:-0.482000 | ret: 0 st: 0 flags:0 ts:-0.482000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st: 0 flags:1 ts: 2.413000 | ret: 0 st: 0 flags:1 ts: 2.413000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 1 flags:0 ts: 1.307000 | ret: 0 st: 1 flags:0 ts: 1.307000 | ||||
| @@ -36,13 +36,13 @@ ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | |||||
| ret: 0 st: 1 flags:1 ts: 0.201000 | ret: 0 st: 1 flags:1 ts: 0.201000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.174000 pts: 0.174000 pos: 78977 size: 278 | ret: 0 st: 1 flags:1 dts: 0.174000 pts: 0.174000 pos: 78977 size: 278 | ||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 0 flags:0 ts: 0.883000 | ret: 0 st: 0 flags:0 ts: 0.883000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 314990 size: 31143 | ||||
| ret: 0 st: 0 flags:1 ts:-0.222000 | ret: 0 st: 0 flags:1 ts:-0.222000 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| ret: 0 st: 1 flags:0 ts: 2.672000 | ret: 0 st: 1 flags:0 ts: 2.672000 | ||||
| ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | ||||
| ret: 0 st: 1 flags:1 ts: 1.566000 | ret: 0 st: 1 flags:1 ts: 1.566000 | ||||
| @@ -50,4 +50,4 @@ ret: 0 st: 1 flags:1 dts: 0.975000 pts: 0.975000 pos: 346136 size: 278 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 158523 size: 31134 | ||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 406 size: 31082 | |||||
| ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 696 size: 31082 | |||||
| @@ -8,9 +8,9 @@ ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317500 | ret: 0 st: 0 flags:1 ts:-0.317500 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st: 1 flags:0 ts: 2.576667 | ret: 0 st: 1 flags:0 ts: 2.576667 | ||||
| ret: 0 st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.470833 | ret: 0 st: 1 flags:1 ts: 1.470833 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159800 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| @@ -20,21 +20,21 @@ ret: 0 st: 0 flags:0 dts: 2.160000 pts: 2.200000 pos: 325616 size: 12679 | |||||
| ret: 0 st: 0 flags:1 ts: 1.047500 | ret: 0 st: 0 flags:1 ts: 1.047500 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st: 1 flags:0 ts:-0.058333 | ret: 0 st: 1 flags:0 ts:-0.058333 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159800 size: 208 | |||||
| ret: 0 st: 1 flags:1 ts: 2.835833 | ret: 0 st: 1 flags:1 ts: 2.835833 | ||||
| ret: 0 st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404012 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 0 flags:0 dts: 1.760000 pts: 1.800000 pos: 162808 size: 12075 | |||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st: 0 flags:0 ts:-0.481667 | ret: 0 st: 0 flags:0 ts:-0.481667 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st: 0 flags:1 ts: 2.412500 | ret: 0 st: 0 flags:1 ts: 2.412500 | ||||
| ret: 0 st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:0 ts: 1.306667 | ret: 0 st: 1 flags:0 ts: 1.306667 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159800 size: 208 | |||||
| ret: 0 st: 1 flags:1 ts: 0.200844 | ret: 0 st: 1 flags:1 ts: 0.200844 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159800 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st:-1 flags:1 ts: 1.989173 | ret: 0 st:-1 flags:1 ts: 1.989173 | ||||
| @@ -44,9 +44,9 @@ ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222489 | ret: 0 st: 0 flags:1 ts:-0.222489 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st: 1 flags:0 ts: 2.671678 | ret: 0 st: 1 flags:0 ts: 2.671678 | ||||
| ret: 0 st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404012 size: 209 | |||||
| ret: 0 st: 1 flags:1 ts: 1.565844 | ret: 0 st: 1 flags:1 ts: 1.565844 | ||||
| ret: 0 st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size: 208 | |||||
| ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159800 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 | ||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| @@ -1,41 +1,41 @@ | |||||
| ret: 0 st: 0 flags:1 dts:-0.040000 pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st:-1 flags:1 ts: 1.894167 | ret:-1 st:-1 flags:1 ts: 1.894167 | ||||
| ret: 0 st: 0 flags:0 ts: 0.788334 | ret: 0 st: 0 flags:0 ts: 0.788334 | ||||
| ret: 0 st: 1 flags:1 dts: 0.783674 pts: 0.783674 pos: 321176 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.772766 pts: 0.772766 pos: 321176 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.317499 | ret: 0 st: 0 flags:1 ts:-0.317499 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st: 1 flags:0 ts: 2.576668 | ret:-1 st: 1 flags:0 ts: 2.576668 | ||||
| ret:-1 st: 1 flags:1 ts: 1.470835 | ret:-1 st: 1 flags:1 ts: 1.470835 | ||||
| ret: 0 st:-1 flags:0 ts: 0.365002 | ret: 0 st:-1 flags:0 ts: 0.365002 | ||||
| ret: 0 st: 1 flags:1 dts: 0.365714 pts: 0.365714 pos: 167160 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.380930 pts: 0.380930 pos: 167496 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.740831 | ret: 0 st:-1 flags:1 ts:-0.740831 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st: 0 flags:0 ts: 2.153336 | ret:-1 st: 0 flags:0 ts: 2.153336 | ||||
| ret:-1 st: 0 flags:1 ts: 1.047503 | ret:-1 st: 0 flags:1 ts: 1.047503 | ||||
| ret: 0 st: 1 flags:0 ts:-0.058330 | ret: 0 st: 1 flags:0 ts:-0.058330 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st: 1 flags:1 ts: 2.835837 | ret:-1 st: 1 flags:1 ts: 2.835837 | ||||
| ret:-1 st:-1 flags:0 ts: 1.730004 | ret:-1 st:-1 flags:0 ts: 1.730004 | ||||
| ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
| ret: 0 st: 1 flags:1 dts: 0.600816 pts: 0.600816 pos: 266240 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.616032 pts: 0.616032 pos: 266576 size: 209 | |||||
| ret: 0 st: 0 flags:0 ts:-0.481662 | ret: 0 st: 0 flags:0 ts:-0.481662 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st: 0 flags:1 ts: 2.412505 | ret:-1 st: 0 flags:1 ts: 2.412505 | ||||
| ret:-1 st: 1 flags:0 ts: 1.306672 | ret:-1 st: 1 flags:0 ts: 1.306672 | ||||
| ret: 0 st: 1 flags:1 ts: 0.200839 | ret: 0 st: 1 flags:1 ts: 0.200839 | ||||
| ret: 0 st: 1 flags:1 dts: 0.208980 pts: 0.208980 pos: 113304 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.224195 pts: 0.224195 pos: 113640 size: 209 | |||||
| ret: 0 st:-1 flags:0 ts:-0.904994 | ret: 0 st:-1 flags:0 ts:-0.904994 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st:-1 flags:1 ts: 1.989173 | ret:-1 st:-1 flags:1 ts: 1.989173 | ||||
| ret: 0 st: 0 flags:0 ts: 0.883340 | ret: 0 st: 0 flags:0 ts: 0.883340 | ||||
| ret: 0 st: 1 flags:1 dts: 0.888163 pts: 0.888163 pos: 357608 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.903379 pts: 0.903379 pos: 357944 size: 209 | |||||
| ret: 0 st: 0 flags:1 ts:-0.222493 | ret: 0 st: 0 flags:1 ts:-0.222493 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||
| ret:-1 st: 1 flags:0 ts: 2.671674 | ret:-1 st: 1 flags:0 ts: 2.671674 | ||||
| ret:-1 st: 1 flags:1 ts: 1.565841 | ret:-1 st: 1 flags:1 ts: 1.565841 | ||||
| ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
| ret: 0 st: 1 flags:1 dts: 0.444082 pts: 0.444082 pos: 205440 size: 209 | |||||
| ret: 0 st: 1 flags:1 dts: 0.459297 pts: 0.459297 pos: 205776 size: 209 | |||||
| ret: 0 st:-1 flags:1 ts:-0.645825 | ret: 0 st:-1 flags:1 ts:-0.645825 | ||||
| ret: 0 st: 0 flags:1 dts: NOPTS pts: 0.000000 pos: 2144 size: 24801 | |||||
| ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 27072 size: 208 | |||||