diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-05-10 02:14:44 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-05-10 02:25:41 +0200 |
commit | 61930bd0d7154b6f3f8c8d2398c056c20e921652 (patch) | |
tree | 54108723e1482e5d20a152f7a46c67ea51441965 /libavcodec | |
parent | 35894ebbf9bef18a31dbb90a8a8818fbdc85a184 (diff) | |
parent | c8b4a3999bc7f3732a537cdec6475918a65d6e78 (diff) | |
download | ffmpeg-61930bd0d7154b6f3f8c8d2398c056c20e921652.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master: (27 commits)
libxvid: Give more suitable names to libxvid-related files.
libxvid: Separate libxvid encoder from libxvid rate control code.
jpeglsdec: Remove write-only variable in ff_jpegls_decode_lse().
fate: cosmetics: lowercase some comments
fate: Give more consistent names to some RealVideo/RealAudio tests.
lavfi: add avfilter_get_audio_buffer_ref_from_arrays().
lavfi: add extended_data to AVFilterBuffer.
lavc: check that extended_data is properly set in avcodec_encode_audio2().
lavc: pad last audio frame with silence when needed.
samplefmt: add a function for filling a buffer with silence.
samplefmt: add a function for copying audio samples.
lavr: do not try to copy to uninitialized output audio data.
lavr: make avresample_read() with NULL output discard samples.
fate: split idroq audio and video into separate tests
fate: improve dependencies
fate: add convenient shorthands for ea-vp6, libavcodec, libavutil tests
fate: split some combined tests into separate audio and video tests
fate: fix dependencies for probe tests
mips: intreadwrite: fix inline asm for gcc 4.8
mips: intreadwrite: remove unnecessary inline asm
...
Conflicts:
cmdutils.h
configure
doc/APIchanges
doc/filters.texi
ffmpeg.c
ffplay.c
libavcodec/internal.h
libavcodec/jpeglsdec.c
libavcodec/libschroedingerdec.c
libavcodec/libxvid.c
libavcodec/libxvid_rc.c
libavcodec/utils.c
libavcodec/version.h
libavfilter/avfilter.c
libavfilter/avfilter.h
libavfilter/buffersink.h
tests/Makefile
tests/fate/aac.mak
tests/fate/audio.mak
tests/fate/demux.mak
tests/fate/ea.mak
tests/fate/image.mak
tests/fate/libavutil.mak
tests/fate/lossless-audio.mak
tests/fate/lossless-video.mak
tests/fate/microsoft.mak
tests/fate/qt.mak
tests/fate/real.mak
tests/fate/screen.mak
tests/fate/video.mak
tests/fate/voice.mak
tests/fate/vqf.mak
tests/ref/fate/ea-mad
tests/ref/fate/ea-tqi
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/Makefile | 3 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 10 | ||||
-rw-r--r-- | libavcodec/internal.h | 6 | ||||
-rw-r--r-- | libavcodec/jpeglsdec.c | 5 | ||||
-rw-r--r-- | libavcodec/libschroedingerdec.c | 97 | ||||
-rw-r--r-- | libavcodec/libxvid.c (renamed from libavcodec/libxvidff.c) | 3 | ||||
-rw-r--r-- | libavcodec/libxvid.h (renamed from libavcodec/libxvid_internal.h) | 6 | ||||
-rw-r--r-- | libavcodec/libxvid_rc.c | 3 | ||||
-rw-r--r-- | libavcodec/options_table.h | 6 | ||||
-rw-r--r-- | libavcodec/utils.c | 81 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
11 files changed, 174 insertions, 48 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 54e79af1ca..41cc9c2aba 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -46,6 +46,7 @@ OBJS-$(CONFIG_GOLOMB) += golomb.o OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o OBJS-$(CONFIG_H264PRED) += h264pred.o OBJS-$(CONFIG_HUFFMAN) += huffman.o +OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o OBJS-$(CONFIG_LPC) += lpc.o OBJS-$(CONFIG_LSP) += lsp.o OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o @@ -677,7 +678,7 @@ OBJS-$(CONFIG_LIBVPX_DECODER) += libvpxdec.o OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o -OBJS-$(CONFIG_LIBXVID) += libxvidff.o libxvid_rc.o +OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o # parsers OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o \ diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index fd0007a635..e4d494b088 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -4044,15 +4044,11 @@ int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx, * @param[in] frame AVFrame containing the raw audio data to be encoded. * May be NULL when flushing an encoder that has the * CODEC_CAP_DELAY capability set. - * There are 2 codec capabilities that affect the allowed - * values of frame->nb_samples. - * If CODEC_CAP_SMALL_LAST_FRAME is set, then only the final - * frame may be smaller than avctx->frame_size, and all other - * frames must be equal to avctx->frame_size. * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame * can have any number of samples. - * If neither is set, frame->nb_samples must be equal to - * avctx->frame_size for all frames. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the * output packet is non-empty, and to 0 if it is * empty. If the function returns an error, the diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 2686468545..8f00695dc8 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -72,6 +72,12 @@ typedef struct AVCodecInternal { #endif /** + * An audio frame with less than required samples has been submitted and + * padded with silence. Reject all subsequent frames. + */ + int last_audio_frame; + + /** * temporary buffer used for encoders to store their bitstream */ uint8_t *byte_buffer; diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index db2158af15..e0f6e88aa6 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -51,10 +51,9 @@ */ int ff_jpegls_decode_lse(MJpegDecodeContext *s) { - int av_unused(len), id; + int id; - /* XXX: verify len field validity */ - len = get_bits(&s->gb, 16); + skip_bits(&s->gb, 16); /* length: FIXME: verify field validity */ id = get_bits(&s->gb, 8); switch(id){ diff --git a/libavcodec/libschroedingerdec.c b/libavcodec/libschroedingerdec.c index 4929eecb28..bf6daf60ac 100644 --- a/libavcodec/libschroedingerdec.c +++ b/libavcodec/libschroedingerdec.c @@ -28,6 +28,7 @@ */ #include "libavutil/imgutils.h" +#include "libavutil/intreadwrite.h" #include "avcodec.h" #include "libschroedinger.h" @@ -39,6 +40,12 @@ #include <schroedinger/schrodebug.h> #include <schroedinger/schrovideoformat.h> +/** SchroFrame and Pts relation */ +typedef struct LibSchroFrameContext { + SchroFrame *frame; + int64_t pts; +} LibSchroFrameContext; + /** libschroedinger decoder private data */ typedef struct SchroDecoderParams { /** Schroedinger video format */ @@ -60,7 +67,7 @@ typedef struct SchroDecoderParams { int eos_pulled; /** decoded picture */ - AVPicture dec_pic; + AVFrame dec_frame; } SchroDecoderParams; typedef struct SchroParseUnitContext { @@ -171,8 +178,8 @@ static void libschroedinger_handle_first_access_unit(AVCodecContext *avccontext) p_schro_params->format = schro_decoder_get_video_format(decoder); /* Tell FFmpeg about sequence details. */ - if (av_image_check_size(p_schro_params->format->width, p_schro_params->format->height, - 0, avccontext) < 0) { + if (av_image_check_size(p_schro_params->format->width, + p_schro_params->format->height, 0, avccontext) < 0) { av_log(avccontext, AV_LOG_ERROR, "invalid dimensions (%dx%d)\n", p_schro_params->format->width, p_schro_params->format->height); avccontext->height = avccontext->width = 0; @@ -192,12 +199,6 @@ static void libschroedinger_handle_first_access_unit(AVCodecContext *avccontext) avccontext->time_base.den = p_schro_params->format->frame_rate_numerator; avccontext->time_base.num = p_schro_params->format->frame_rate_denominator; - - if (!p_schro_params->dec_pic.data[0]) - avpicture_alloc(&p_schro_params->dec_pic, - avccontext->pix_fmt, - avccontext->width, - avccontext->height); } static int libschroedinger_decode_frame(AVCodecContext *avccontext, @@ -206,16 +207,18 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext, { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; + int64_t pts = avpkt->pts; + SchroTag *tag; SchroDecoderParams *p_schro_params = avccontext->priv_data; SchroDecoder *decoder = p_schro_params->decoder; - AVPicture *picture = data; SchroBuffer *enc_buf; SchroFrame* frame; int state; int go = 1; int outer = 1; SchroParseUnitContext parse_ctx; + LibSchroFrameContext *framewithpts = NULL; *data_size = 0; @@ -230,6 +233,13 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext, /* Loop through all the individual parse units in the input buffer */ do { if ((enc_buf = find_next_parse_unit(&parse_ctx))) { + /* Set Schrotag with the pts to be recovered after decoding*/ + enc_buf->tag = schro_tag_new(av_malloc(sizeof(int64_t)), av_free); + if (!enc_buf->tag->value) { + av_log(avccontext, AV_LOG_ERROR, "Unable to allocate SchroTag\n"); + return AVERROR(ENOMEM); + } + AV_WN(64, enc_buf->tag->value, pts); /* Push buffer into decoder. */ if (SCHRO_PARSE_CODE_IS_PICTURE(enc_buf->data[4]) && SCHRO_PARSE_CODE_NUM_REFS(enc_buf->data[4]) > 0) @@ -263,11 +273,21 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext, case SCHRO_DECODER_OK: /* Pull a frame out of the decoder. */ + tag = schro_decoder_get_picture_tag(decoder); frame = schro_decoder_pull(decoder); - if (frame) + if (frame) { + /* Add relation between schroframe and pts. */ + framewithpts = av_malloc(sizeof(LibSchroFrameContext)); + if (!framewithpts) { + av_log(avccontext, AV_LOG_ERROR, "Unable to allocate FrameWithPts\n"); + return AVERROR(ENOMEM); + } + framewithpts->frame = frame; + framewithpts->pts = AV_RN64(tag->value); ff_schro_queue_push_back(&p_schro_params->dec_frame_queue, - frame); + framewithpts); + } break; case SCHRO_DECODER_EOS: go = 0; @@ -284,30 +304,46 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext, } while (outer); /* Grab next frame to be returned from the top of the queue. */ - frame = ff_schro_queue_pop(&p_schro_params->dec_frame_queue); + framewithpts = ff_schro_queue_pop(&p_schro_params->dec_frame_queue); + + if (framewithpts && framewithpts->frame) { + if (p_schro_params->dec_frame.data[0]) + avccontext->release_buffer(avccontext, &p_schro_params->dec_frame); + if (avccontext->get_buffer(avccontext, &p_schro_params->dec_frame) < 0) { + av_log(avccontext, AV_LOG_ERROR, "Unable to allocate buffer\n"); + return AVERROR(ENOMEM); + } - if (frame) { - memcpy(p_schro_params->dec_pic.data[0], - frame->components[0].data, - frame->components[0].length); + memcpy(p_schro_params->dec_frame.data[0], + framewithpts->frame->components[0].data, + framewithpts->frame->components[0].length); - memcpy(p_schro_params->dec_pic.data[1], - frame->components[1].data, - frame->components[1].length); + memcpy(p_schro_params->dec_frame.data[1], + framewithpts->frame->components[1].data, + framewithpts->frame->components[1].length); - memcpy(p_schro_params->dec_pic.data[2], - frame->components[2].data, - frame->components[2].length); + memcpy(p_schro_params->dec_frame.data[2], + framewithpts->frame->components[2].data, + framewithpts->frame->components[2].length); - /* Fill picture with current buffer data from Schroedinger. */ - avpicture_fill(picture, p_schro_params->dec_pic.data[0], - avccontext->pix_fmt, - avccontext->width, avccontext->height); + /* Fill frame with current buffer data from Schroedinger. */ + p_schro_params->dec_frame.format = -1; /* Unknown -1 */ + p_schro_params->dec_frame.width = framewithpts->frame->width; + p_schro_params->dec_frame.height = framewithpts->frame->height; + p_schro_params->dec_frame.pkt_pts = framewithpts->pts; + p_schro_params->dec_frame.linesize[0] = framewithpts->frame->components[0].stride; + p_schro_params->dec_frame.linesize[1] = framewithpts->frame->components[1].stride; + p_schro_params->dec_frame.linesize[2] = framewithpts->frame->components[2].stride; - *data_size = sizeof(AVPicture); + *(AVFrame*)data = p_schro_params->dec_frame; + *data_size = sizeof(AVFrame); /* Now free the frame resources. */ - libschroedinger_decode_frame_free(frame); + libschroedinger_decode_frame_free(framewithpts->frame); + av_free(framewithpts); + } else { + data = NULL; + *data_size = 0; } return buf_size; } @@ -320,7 +356,8 @@ static av_cold int libschroedinger_decode_close(AVCodecContext *avccontext) schro_decoder_free(p_schro_params->decoder); av_freep(&p_schro_params->format); - avpicture_free(&p_schro_params->dec_pic); + if (p_schro_params->dec_frame.data[0]) + avccontext->release_buffer(avccontext, &p_schro_params->dec_frame); /* Free data in the output frame queue. */ ff_schro_queue_free(&p_schro_params->dec_frame_queue, diff --git a/libavcodec/libxvidff.c b/libavcodec/libxvid.c index 0426e9de14..4b4f7824b1 100644 --- a/libavcodec/libxvidff.c +++ b/libavcodec/libxvid.c @@ -33,7 +33,7 @@ #include "libavutil/cpu.h" #include "libavutil/intreadwrite.h" #include "libavutil/mathematics.h" -#include "libxvid_internal.h" +#include "libxvid.h" #include "mpegvideo.h" /** @@ -82,7 +82,6 @@ struct xvid_ff_pass1 { * rate-control plugin. */ - /** * Initialize the two-pass plugin and context. * diff --git a/libavcodec/libxvid_internal.h b/libavcodec/libxvid.h index 6517f62174..90ecd6f40b 100644 --- a/libavcodec/libxvid_internal.h +++ b/libavcodec/libxvid.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_LIBXVID_INTERNAL_H -#define AVCODEC_LIBXVID_INTERNAL_H +#ifndef AVCODEC_LIBXVID_H +#define AVCODEC_LIBXVID_H /** * @file @@ -29,4 +29,4 @@ int ff_tempfile(const char *prefix, char **filename); -#endif /* AVCODEC_LIBXVID_INTERNAL_H */ +#endif /* AVCODEC_LIBXVID_H */ diff --git a/libavcodec/libxvid_rc.c b/libavcodec/libxvid_rc.c index 71579ebe7a..0f9e50e005 100644 --- a/libavcodec/libxvid_rc.c +++ b/libavcodec/libxvid_rc.c @@ -20,11 +20,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" #include <xvid.h> #include <unistd.h> #include "libavutil/file.h" #include "avcodec.h" -#include "libxvid_internal.h" +#include "libxvid.h" //#include "dsputil.h" #include "mpegvideo.h" diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index c4d4277b04..92b19e23a2 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -22,6 +22,12 @@ #ifndef AVCODEC_OPTIONS_TABLE #define AVCODEC_OPTIONS_TABLE +#include <float.h> +#include <limits.h> + +#include "libavutil/opt.h" +#include "avcodec.h" + #define OFFSET(x) offsetof(AVCodecContext,x) #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C //these names are too long to be readable diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 79b355472e..c915de6a06 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1001,11 +1001,59 @@ int ff_alloc_packet(AVPacket *avpkt, int size) return ff_alloc_packet2(NULL, avpkt, size); } +/** + * Pad last frame with silence. + */ +static int pad_last_frame(AVCodecContext *s, AVFrame **dst, const AVFrame *src) +{ + AVFrame *frame = NULL; + uint8_t *buf = NULL; + int ret; + + if (!(frame = avcodec_alloc_frame())) + return AVERROR(ENOMEM); + *frame = *src; + + if ((ret = av_samples_get_buffer_size(&frame->linesize[0], s->channels, + s->frame_size, s->sample_fmt, 0)) < 0) + goto fail; + + if (!(buf = av_malloc(ret))) { + ret = AVERROR(ENOMEM); + goto fail; + } + + frame->nb_samples = s->frame_size; + if ((ret = avcodec_fill_audio_frame(frame, s->channels, s->sample_fmt, + buf, ret, 0)) < 0) + goto fail; + if ((ret = av_samples_copy(frame->extended_data, src->extended_data, 0, 0, + src->nb_samples, s->channels, s->sample_fmt)) < 0) + goto fail; + if ((ret = av_samples_set_silence(frame->extended_data, src->nb_samples, + frame->nb_samples - src->nb_samples, + s->channels, s->sample_fmt)) < 0) + goto fail; + + *dst = frame; + + return 0; + +fail: + if (frame->extended_data != frame->data) + av_freep(&frame->extended_data); + av_freep(&buf); + av_freep(&frame); + return ret; +} + int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr) { + AVFrame tmp; + AVFrame *padded_frame = NULL; int ret; AVPacket user_pkt = *avpkt; int needs_realloc = !user_pkt.data; @@ -1018,12 +1066,38 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, return 0; } + /* ensure that extended_data is properly set */ + if (frame && !frame->extended_data) { + if (av_sample_fmt_is_planar(avctx->sample_fmt) && + avctx->channels > AV_NUM_DATA_POINTERS) { + av_log(avctx, AV_LOG_ERROR, "Encoding to a planar sample format, " + "with more than %d channels, but extended_data is not set.\n", + AV_NUM_DATA_POINTERS); + return AVERROR(EINVAL); + } + av_log(avctx, AV_LOG_WARNING, "extended_data is not set.\n"); + + tmp = *frame; + tmp.extended_data = tmp.data; + frame = &tmp; + } + /* check for valid frame size */ if (frame) { if (avctx->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) { if (frame->nb_samples > avctx->frame_size) return AVERROR(EINVAL); } else if (!(avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) { + if (frame->nb_samples < avctx->frame_size && + !avctx->internal->last_audio_frame) { + ret = pad_last_frame(avctx, &padded_frame, frame); + if (ret < 0) + return ret; + + frame = padded_frame; + avctx->internal->last_audio_frame = 1; + } + if (frame->nb_samples != avctx->frame_size) return AVERROR(EINVAL); } @@ -1084,6 +1158,13 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, here to simplify things */ avpkt->flags |= AV_PKT_FLAG_KEY; + if (padded_frame) { + av_freep(&padded_frame->data[0]); + if (padded_frame->extended_data != padded_frame->data) + av_freep(&padded_frame->extended_data); + av_freep(&padded_frame); + } + return ret; } diff --git a/libavcodec/version.h b/libavcodec/version.h index 0ee3fd016b..a9fa31ac48 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,7 +28,7 @@ #define LIBAVCODEC_VERSION_MAJOR 54 #define LIBAVCODEC_VERSION_MINOR 21 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ |