ffmpeg: use lavf API for applying bitstream filters
This commit is contained in:
46
ffmpeg.c
46
ffmpeg.c
@@ -683,47 +683,10 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
|||||||
if (bsfc)
|
if (bsfc)
|
||||||
av_packet_split_side_data(pkt);
|
av_packet_split_side_data(pkt);
|
||||||
|
|
||||||
while (bsfc) {
|
if ((ret = av_apply_bitstream_filters(avctx, pkt, bsfc)) < 0) {
|
||||||
AVPacket new_pkt = *pkt;
|
print_error("", ret);
|
||||||
AVDictionaryEntry *bsf_arg = av_dict_get(ost->bsf_args,
|
if (exit_on_error)
|
||||||
bsfc->filter->name,
|
exit_program(1);
|
||||||
NULL, 0);
|
|
||||||
int a = av_bitstream_filter_filter(bsfc, avctx,
|
|
||||||
bsf_arg ? bsf_arg->value : NULL,
|
|
||||||
&new_pkt.data, &new_pkt.size,
|
|
||||||
pkt->data, pkt->size,
|
|
||||||
pkt->flags & AV_PKT_FLAG_KEY);
|
|
||||||
if(a == 0 && new_pkt.data != pkt->data) {
|
|
||||||
uint8_t *t = av_malloc(new_pkt.size + AV_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow
|
|
||||||
if(t) {
|
|
||||||
memcpy(t, new_pkt.data, new_pkt.size);
|
|
||||||
memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
|
||||||
new_pkt.data = t;
|
|
||||||
new_pkt.buf = NULL;
|
|
||||||
a = 1;
|
|
||||||
} else
|
|
||||||
a = AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
if (a > 0) {
|
|
||||||
pkt->side_data = NULL;
|
|
||||||
pkt->side_data_elems = 0;
|
|
||||||
av_packet_unref(pkt);
|
|
||||||
new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
|
|
||||||
av_buffer_default_free, NULL, 0);
|
|
||||||
if (!new_pkt.buf)
|
|
||||||
exit_program(1);
|
|
||||||
} else if (a < 0) {
|
|
||||||
new_pkt = *pkt;
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
|
|
||||||
bsfc->filter->name, pkt->stream_index,
|
|
||||||
avctx->codec ? avctx->codec->name : "copy");
|
|
||||||
print_error("", a);
|
|
||||||
if (exit_on_error)
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
*pkt = new_pkt;
|
|
||||||
|
|
||||||
bsfc = bsfc->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
|
if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
|
||||||
@@ -4244,7 +4207,6 @@ static int transcode(void)
|
|||||||
av_dict_free(&ost->sws_dict);
|
av_dict_free(&ost->sws_dict);
|
||||||
av_dict_free(&ost->swr_opts);
|
av_dict_free(&ost->swr_opts);
|
||||||
av_dict_free(&ost->resample_opts);
|
av_dict_free(&ost->resample_opts);
|
||||||
av_dict_free(&ost->bsf_args);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
ffmpeg.h
1
ffmpeg.h
@@ -454,7 +454,6 @@ typedef struct OutputStream {
|
|||||||
AVDictionary *sws_dict;
|
AVDictionary *sws_dict;
|
||||||
AVDictionary *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
AVDictionary *resample_opts;
|
AVDictionary *resample_opts;
|
||||||
AVDictionary *bsf_args;
|
|
||||||
char *apad;
|
char *apad;
|
||||||
OSTFinished finished; /* no more packets should be written for this stream */
|
OSTFinished finished; /* no more packets should be written for this stream */
|
||||||
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
||||||
|
@@ -1255,7 +1255,11 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
bsfc_prev->next = bsfc;
|
bsfc_prev->next = bsfc;
|
||||||
else
|
else
|
||||||
ost->bitstream_filters = bsfc;
|
ost->bitstream_filters = bsfc;
|
||||||
av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
|
if (arg)
|
||||||
|
if (!(bsfc->args = av_strdup(arg))) {
|
||||||
|
av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n");
|
||||||
|
exit_program(1);
|
||||||
|
}
|
||||||
|
|
||||||
bsfc_prev = bsfc;
|
bsfc_prev = bsfc;
|
||||||
bsf = next;
|
bsf = next;
|
||||||
|
Reference in New Issue
Block a user