Unified · Split
| @@ -2048,14 +2048,6 @@ static void flush_encoders(void) · 2047 unmodified lines | ||
| 2048 | 2048 | |
| 2049 | 2049 | av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL); |
| 2050 | 2050 | |
| 2051 | − /* pad last frame with silence if needed */ | |
| 2052 | − if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) { | |
| 2053 | − frame_bytes = enc->frame_size * enc->channels * | |
| 2054 | − av_get_bytes_per_sample(enc->sample_fmt); | |
| 2055 | − if (allocated_audio_buf_size < frame_bytes) | |
| 2056 | − exit_program(1); | |
| 2057 | − generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes); | |
| 2058 | − } | |
| 2059 | 2051 | encode_audio_frame(os, ost, audio_buf, frame_bytes); |
| 2060 | 2052 | } else { |
| 2061 | 2053 | /* flush encoder with NULL frames until it is done |
| @@ -13,6 +13,12 @@ libavutil: 2011-04-18 · 12 unmodified lines | ||
| 13 | 13 | |
| 14 | 14 | API changes, most recent first: |
| 15 | 15 | |
| 16 | +2012-xx-xx - xxxxxxx - lavc 54.13.1 | |
| 17 | + For audio formats with fixed frame size, the last frame | |
| 18 | + no longer needs to be padded with silence, libavcodec | |
| 19 | + will handle this internally (effectively all encoders | |
| 20 | + behave as if they had CODEC_CAP_SMALL_LAST_FRAME set). | |
| 21 | + | |
| 16 | 22 | 2012-xx-xx - xxxxxxx - lavc 54.13.0 - avcodec.h |
| 17 | 23 | Add sample_rate and channel_layout fields to AVFrame. |
| 18 | 24 | |
| @@ -3860,15 +3860,11 @@ int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx, · 3859 unmodified lines | ||
| 3860 | 3860 | * @param[in] frame AVFrame containing the raw audio data to be encoded. |
| 3861 | 3861 | * May be NULL when flushing an encoder that has the |
| 3862 | 3862 | * CODEC_CAP_DELAY capability set. |
| 3863 | − * There are 2 codec capabilities that affect the allowed | |
| 3864 | − * values of frame->nb_samples. | |
| 3865 | − * If CODEC_CAP_SMALL_LAST_FRAME is set, then only the final | |
| 3866 | − * frame may be smaller than avctx->frame_size, and all other | |
| 3867 | − * frames must be equal to avctx->frame_size. | |
| 3868 | 3863 | * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame |
| 3869 | 3864 | * can have any number of samples. |
| 3870 | − * If neither is set, frame->nb_samples must be equal to | |
| 3871 | − * avctx->frame_size for all frames. | |
| 3865 | + * If it is not set, frame->nb_samples must be equal to | |
| 3866 | + * avctx->frame_size for all frames except the last. | |
| 3867 | + * The final frame may be smaller than avctx->frame_size. | |
| 3872 | 3868 | * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the |
| 3873 | 3869 | * output packet is non-empty, and to 0 if it is |
| 3874 | 3870 | * empty. If the function returns an error, the |
| @@ -70,6 +70,12 @@ typedef struct AVCodecInternal { · 69 unmodified lines | ||
| 70 | 70 | */ |
| 71 | 71 | int sample_count; |
| 72 | 72 | #endif |
| 73 | + | |
| 74 | + /** | |
| 75 | + * An audio frame with less than required samples has been submitted and | |
| 76 | + * padded with silence. Reject all subsequent frames. | |
| 77 | + */ | |
| 78 | + int last_audio_frame; | |
| 73 | 79 | } AVCodecInternal; |
| 74 | 80 | |
| 75 | 81 | struct AVCodecDefault { |
| @@ -857,11 +857,58 @@ int ff_alloc_packet(AVPacket *avpkt, int size) · 856 unmodified lines | ||
| 857 | 857 | } |
| 858 | 858 | } |
| 859 | 859 | |
| 860 | +/** | |
| 861 | + * Pad last frame with silence. | |
| 862 | + */ | |
| 863 | +static int pad_last_frame(AVCodecContext *s, AVFrame **dst, const AVFrame *src) | |
| 864 | +{ | |
| 865 | + AVFrame *frame = NULL; | |
| 866 | + uint8_t *buf = NULL; | |
| 867 | + int ret; | |
| 868 | + | |
| 869 | + if (!(frame = avcodec_alloc_frame())) | |
| 870 | + return AVERROR(ENOMEM); | |
| 871 | + *frame = *src; | |
| 872 | + | |
| 873 | + if ((ret = av_samples_get_buffer_size(&frame->linesize[0], s->channels, | |
| 874 | + s->frame_size, s->sample_fmt, 0)) < 0) | |
| 875 | + goto fail; | |
| 876 | + | |
| 877 | + if (!(buf = av_malloc(ret))) { | |
| 878 | + ret = AVERROR(ENOMEM); | |
| 879 | + goto fail; | |
| 880 | + } | |
| 881 | + | |
| 882 | + frame->nb_samples = s->frame_size; | |
| 883 | + if ((ret = avcodec_fill_audio_frame(frame, s->channels, s->sample_fmt, | |
| 884 | + buf, ret, 0)) < 0) | |
| 885 | + goto fail; | |
| 886 | + if ((ret = av_samples_copy(frame->extended_data, src->extended_data, 0, 0, | |
| 887 | + src->nb_samples, s->channels, s->sample_fmt)) < 0) | |
| 888 | + goto fail; | |
| 889 | + if ((ret = av_samples_set_silence(frame->extended_data, src->nb_samples, | |
| 890 | + frame->nb_samples - src->nb_samples, | |
| 891 | + s->channels, s->sample_fmt)) < 0) | |
| 892 | + goto fail; | |
| 893 | + | |
| 894 | + *dst = frame; | |
| 895 | + | |
| 896 | + return 0; | |
| 897 | + | |
| 898 | +fail: | |
| 899 | + if (frame->extended_data != frame->data) | |
| 900 | + av_freep(&frame->extended_data); | |
| 901 | + av_freep(&buf); | |
| 902 | + av_freep(&frame); | |
| 903 | + return ret; | |
| 904 | +} | |
| 905 | + | |
| 860 | 906 | int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, |
| 861 | 907 | AVPacket *avpkt, |
| 862 | 908 | const AVFrame *frame, |
| 863 | 909 | int *got_packet_ptr) |
| 864 | 910 | { |
| 911 | + AVFrame *padded_frame = NULL; | |
| 865 | 912 | int ret; |
| 866 | 913 | int user_packet = !!avpkt->data; |
| 867 | 914 | |
| @@ -879,6 +926,16 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, · 11 unmodified lines | ||
| 879 | 926 | if (frame->nb_samples > avctx->frame_size) |
| 880 | 927 | return AVERROR(EINVAL); |
| 881 | 928 | } else if (!(avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) { |
| 929 | + if (frame->nb_samples < avctx->frame_size && | |
| 930 | + !avctx->internal->last_audio_frame) { | |
| 931 | + ret = pad_last_frame(avctx, &padded_frame, frame); | |
| 932 | + if (ret < 0) | |
| 933 | + return ret; | |
| 934 | + | |
| 935 | + frame = padded_frame; | |
| 936 | + avctx->internal->last_audio_frame = 1; | |
| 937 | + } | |
| 938 | + | |
| 882 | 939 | if (frame->nb_samples != avctx->frame_size) |
| 883 | 940 | return AVERROR(EINVAL); |
| 884 | 941 | } |
| @@ -919,6 +976,13 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, · 34 unmodified lines | ||
| 919 | 976 | here to simplify things */ |
| 920 | 977 | avpkt->flags |= AV_PKT_FLAG_KEY; |
| 921 | 978 | |
| 979 | + if (padded_frame) { | |
| 980 | + av_freep(&padded_frame->data[0]); | |
| 981 | + if (padded_frame->extended_data != padded_frame->data) | |
| 982 | + av_freep(&padded_frame->extended_data); | |
| 983 | + av_freep(&padded_frame); | |
| 984 | + } | |
| 985 | + | |
| 922 | 986 | return ret; |
| 923 | 987 | } |
| 924 | 988 | |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | |
| 29 | 29 | #define LIBAVCODEC_VERSION_MAJOR 54 |
| 30 | 30 | #define LIBAVCODEC_VERSION_MINOR 13 |
| 31 | −#define LIBAVCODEC_VERSION_MICRO 0 | |
| 31 | +#define LIBAVCODEC_VERSION_MICRO 1 | |
| 32 | 32 | |
| 33 | 33 | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |
| 34 | 34 | LIBAVCODEC_VERSION_MINOR, \ |