|
|
|
@ -57,8 +57,6 @@ typedef struct { |
|
|
|
|
AVFilterBufferRef *picref; |
|
|
|
|
|
|
|
|
|
/* audio-only fields */ |
|
|
|
|
void *samples_buf; |
|
|
|
|
int samples_buf_size; |
|
|
|
|
int bps; ///< bytes per sample
|
|
|
|
|
AVPacket pkt, pkt0; |
|
|
|
|
AVFilterBufferRef *samplesref; |
|
|
|
@ -176,6 +174,11 @@ static av_cold int movie_common_init(AVFilterContext *ctx, const char *args, voi |
|
|
|
|
movie->seek_point, movie->format_name, movie->file_name, |
|
|
|
|
movie->stream_index); |
|
|
|
|
|
|
|
|
|
if (!(movie->frame = avcodec_alloc_frame()) ) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "Failed to alloc frame\n"); |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -194,7 +197,6 @@ static av_cold void movie_common_uninit(AVFilterContext *ctx) |
|
|
|
|
av_freep(&movie->frame); |
|
|
|
|
|
|
|
|
|
avfilter_unref_buffer(movie->samplesref); |
|
|
|
|
av_freep(&movie->samples_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if CONFIG_MOVIE_FILTER |
|
|
|
@ -207,11 +209,6 @@ static av_cold int movie_init(AVFilterContext *ctx, const char *args, void *opaq |
|
|
|
|
if ((ret = movie_common_init(ctx, args, opaque, AVMEDIA_TYPE_VIDEO)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if (!(movie->frame = avcodec_alloc_frame()) ) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "Failed to alloc frame\n"); |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
movie->w = movie->codec_ctx->width; |
|
|
|
|
movie->h = movie->codec_ctx->height; |
|
|
|
|
|
|
|
|
@ -378,7 +375,7 @@ static int amovie_get_samples(AVFilterLink *outlink) |
|
|
|
|
{ |
|
|
|
|
MovieContext *movie = outlink->src->priv; |
|
|
|
|
AVPacket pkt; |
|
|
|
|
int ret, samples_size, decoded_data_size; |
|
|
|
|
int ret, got_frame = 0; |
|
|
|
|
|
|
|
|
|
if (!movie->pkt.size && movie->is_done == 1) |
|
|
|
|
return AVERROR_EOF; |
|
|
|
@ -402,20 +399,9 @@ static int amovie_get_samples(AVFilterLink *outlink) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* reallocate the buffer for the decoded samples, if necessary */ |
|
|
|
|
samples_size = |
|
|
|
|
FFMAX(movie->pkt.size*sizeof(movie->bps), AVCODEC_MAX_AUDIO_FRAME_SIZE); |
|
|
|
|
if (samples_size > movie->samples_buf_size) { |
|
|
|
|
movie->samples_buf = av_fast_realloc(movie->samples_buf, |
|
|
|
|
&movie->samples_buf_size, samples_size); |
|
|
|
|
if (!movie->samples_buf) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
decoded_data_size = movie->samples_buf_size; |
|
|
|
|
|
|
|
|
|
/* decode and update the movie pkt */ |
|
|
|
|
ret = avcodec_decode_audio3(movie->codec_ctx, movie->samples_buf, |
|
|
|
|
&decoded_data_size, &movie->pkt); |
|
|
|
|
avcodec_get_frame_defaults(movie->frame); |
|
|
|
|
ret = avcodec_decode_audio4(movie->codec_ctx, movie->frame, &got_frame, &movie->pkt); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
movie->pkt.size = 0; |
|
|
|
|
return ret; |
|
|
|
@ -424,11 +410,16 @@ static int amovie_get_samples(AVFilterLink *outlink) |
|
|
|
|
movie->pkt.size -= ret; |
|
|
|
|
|
|
|
|
|
/* wrap the decoded data in a samplesref */ |
|
|
|
|
if (decoded_data_size > 0) { |
|
|
|
|
int nb_samples = decoded_data_size / movie->bps / movie->codec_ctx->channels; |
|
|
|
|
if (got_frame) { |
|
|
|
|
int nb_samples = movie->frame->nb_samples; |
|
|
|
|
int data_size = |
|
|
|
|
av_samples_get_buffer_size(NULL, movie->codec_ctx->channels, |
|
|
|
|
nb_samples, movie->codec_ctx->sample_fmt, 1); |
|
|
|
|
if (data_size < 0) |
|
|
|
|
return data_size; |
|
|
|
|
movie->samplesref = |
|
|
|
|
avfilter_get_audio_buffer(outlink, AV_PERM_WRITE, nb_samples); |
|
|
|
|
memcpy(movie->samplesref->data[0], movie->samples_buf, decoded_data_size); |
|
|
|
|
memcpy(movie->samplesref->data[0], movie->frame->data[0], data_size); |
|
|
|
|
movie->samplesref->pts = movie->pkt.pts; |
|
|
|
|
movie->samplesref->pos = movie->pkt.pos; |
|
|
|
|
movie->samplesref->audio->sample_rate = movie->codec_ctx->sample_rate; |
|
|
|
|