|
|
|
@ -558,9 +558,7 @@ static void ffmpeg_cleanup(int ret) |
|
|
|
|
if (!ost) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
for (j = 0; j < ost->nb_bitstream_filters; j++) |
|
|
|
|
av_bsf_free(&ost->bsf_ctx[j]); |
|
|
|
|
av_freep(&ost->bsf_ctx); |
|
|
|
|
av_bsf_free(&ost->bsf_ctx); |
|
|
|
|
|
|
|
|
|
av_frame_free(&ost->filtered_frame); |
|
|
|
|
av_frame_free(&ost->last_frame); |
|
|
|
@ -859,40 +857,15 @@ static void output_packet(OutputFile *of, AVPacket *pkt, |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
/* apply the output bitstream filters, if any */ |
|
|
|
|
if (ost->nb_bitstream_filters) { |
|
|
|
|
int idx; |
|
|
|
|
|
|
|
|
|
ret = av_bsf_send_packet(ost->bsf_ctx[0], eof ? NULL : pkt); |
|
|
|
|
if (ret < 0) |
|
|
|
|
goto finish; |
|
|
|
|
|
|
|
|
|
eof = 0; |
|
|
|
|
idx = 1; |
|
|
|
|
while (idx) { |
|
|
|
|
/* get a packet from the previous filter up the chain */ |
|
|
|
|
ret = av_bsf_receive_packet(ost->bsf_ctx[idx - 1], pkt); |
|
|
|
|
if (ret == AVERROR(EAGAIN)) { |
|
|
|
|
ret = 0; |
|
|
|
|
idx--; |
|
|
|
|
continue; |
|
|
|
|
} else if (ret == AVERROR_EOF) { |
|
|
|
|
eof = 1; |
|
|
|
|
} else if (ret < 0) |
|
|
|
|
goto finish; |
|
|
|
|
|
|
|
|
|
/* send it to the next filter down the chain or to the muxer */ |
|
|
|
|
if (idx < ost->nb_bitstream_filters) { |
|
|
|
|
ret = av_bsf_send_packet(ost->bsf_ctx[idx], eof ? NULL : pkt); |
|
|
|
|
/* apply the output bitstream filters */ |
|
|
|
|
if (ost->bsf_ctx) { |
|
|
|
|
ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt); |
|
|
|
|
if (ret < 0) |
|
|
|
|
goto finish; |
|
|
|
|
idx++; |
|
|
|
|
eof = 0; |
|
|
|
|
} else if (eof) |
|
|
|
|
goto finish; |
|
|
|
|
else |
|
|
|
|
while ((ret = av_bsf_receive_packet(ost->bsf_ctx, pkt)) >= 0) |
|
|
|
|
write_packet(of, pkt, ost, 0); |
|
|
|
|
} |
|
|
|
|
if (ret == AVERROR(EAGAIN)) |
|
|
|
|
ret = 0; |
|
|
|
|
} else if (!eof) |
|
|
|
|
write_packet(of, pkt, ost, 0); |
|
|
|
|
|
|
|
|
@ -3015,35 +2988,28 @@ static int check_init_output_file(OutputFile *of, int file_index) |
|
|
|
|
|
|
|
|
|
static int init_output_bsfs(OutputStream *ost) |
|
|
|
|
{ |
|
|
|
|
AVBSFContext *ctx; |
|
|
|
|
int i, ret; |
|
|
|
|
AVBSFContext *ctx = ost->bsf_ctx; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (!ost->nb_bitstream_filters) |
|
|
|
|
if (!ctx) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ost->nb_bitstream_filters; i++) { |
|
|
|
|
ctx = ost->bsf_ctx[i]; |
|
|
|
|
|
|
|
|
|
ret = avcodec_parameters_copy(ctx->par_in, |
|
|
|
|
i ? ost->bsf_ctx[i - 1]->par_out : ost->st->codecpar); |
|
|
|
|
ret = avcodec_parameters_copy(ctx->par_in, ost->st->codecpar); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
ctx->time_base_in = i ? ost->bsf_ctx[i - 1]->time_base_out : ost->st->time_base; |
|
|
|
|
ctx->time_base_in = ost->st->time_base; |
|
|
|
|
|
|
|
|
|
ret = av_bsf_init(ctx); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
av_log(NULL, AV_LOG_ERROR, "Error initializing bitstream filter: %s\n", |
|
|
|
|
ost->bsf_ctx[i]->filter->name); |
|
|
|
|
ctx->filter->name); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx = ost->bsf_ctx[ost->nb_bitstream_filters - 1]; |
|
|
|
|
ret = avcodec_parameters_copy(ost->st->codecpar, ctx->par_out); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
ost->st->time_base = ctx->time_base_out; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|