X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fflacenc.c;h=1160da2ecd28e2cf37b0229cee65c8ff01001462;hb=45ce880a9b3e50cfa088f111dffaf8685bd7bc6b;hp=15b0e5530d1a95551dd7af108f13c2de6ccdd745;hpb=a5f8873620ce502d37d0cc3ef93ada2ea8fb8de7;p=ffmpeg diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index 15b0e5530d1..1160da2ecd2 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -24,7 +24,7 @@ #include "libavutil/md5.h" #include "libavutil/opt.h" #include "avcodec.h" -#include "dsputil.h" +#include "bswapdsp.h" #include "get_bits.h" #include "golomb.h" #include "internal.h" @@ -112,8 +112,11 @@ typedef struct FlacEncodeContext { struct AVMD5 *md5ctx; uint8_t *md5_buffer; unsigned int md5_buffer_size; - DSPContext dsp; + BswapDSPContext bdsp; FLACDSPContext flac_dsp; + + int flushed; + int64_t next_pts; } FlacEncodeContext; @@ -397,7 +400,7 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) ret = ff_lpc_init(&s->lpc_ctx, avctx->frame_size, s->options.max_prediction_order, FF_LPC_TYPE_LEVINSON); - ff_dsputil_init(&s->dsp, avctx); + ff_bswapdsp_init(&s->bdsp); ff_flacdsp_init(&s->flac_dsp, avctx->sample_fmt, avctx->bits_per_raw_sample); @@ -1176,8 +1179,8 @@ static int update_md5_sum(FlacEncodeContext *s, const void *samples) if (s->avctx->bits_per_raw_sample <= 16) { buf = (const uint8_t *)samples; #if HAVE_BIGENDIAN - s->dsp.bswap16_buf((uint16_t *)s->md5_buffer, - (const uint16_t *)samples, buf_size / 2); + s->bdsp.bswap16_buf((uint16_t *) s->md5_buffer, + (const uint16_t *) samples, buf_size / 2); buf = s->md5_buffer; #endif } else { @@ -1212,6 +1215,20 @@ static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, s->max_framesize = s->max_encoded_framesize; av_md5_final(s->md5ctx, s->md5sum); write_streaminfo(s, avctx->extradata); + + if (avctx->side_data_only_packets && !s->flushed) { + uint8_t *side_data = av_packet_new_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, + avctx->extradata_size); + if (!side_data) + return AVERROR(ENOMEM); + memcpy(side_data, avctx->extradata, avctx->extradata_size); + + avpkt->pts = s->next_pts; + + *got_packet_ptr = 1; + s->flushed = 1; + } + return 0; } @@ -1264,6 +1281,9 @@ static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, avpkt->pts = frame->pts; avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples); avpkt->size = out_bytes; + + s->next_pts = avpkt->pts + avpkt->duration; + *got_packet_ptr = 1; return 0; } @@ -1318,6 +1338,7 @@ static const AVClass flac_encoder_class = { AVCodec ff_flac_encoder = { .name = "flac", + .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_FLAC, .priv_data_size = sizeof(FlacEncodeContext), @@ -1328,6 +1349,5 @@ AVCodec ff_flac_encoder = { .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_NONE }, - .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), .priv_class = &flac_encoder_class, };