forked from FFmpeg/FFmpeg
fftools/ffmpeg: move sending filtergraph commands to a separate function
Stop accessing filtergraph internals from keyboard reading code.
This commit is contained in:
parent
bff48e8d69
commit
3c397a1d46
3 changed files with 31 additions and 22 deletions
|
@ -97,10 +97,6 @@
|
|||
|
||||
#include "libswresample/swresample.h"
|
||||
|
||||
#include "libavfilter/avfilter.h"
|
||||
#include "libavfilter/buffersrc.h"
|
||||
#include "libavfilter/buffersink.h"
|
||||
|
||||
#include "cmdutils.h"
|
||||
#include "ffmpeg.h"
|
||||
#include "sync_queue.h"
|
||||
|
@ -977,7 +973,7 @@ static void set_tty_echo(int on)
|
|||
|
||||
static int check_keyboard_interaction(int64_t cur_time)
|
||||
{
|
||||
int i, ret, key;
|
||||
int i, key;
|
||||
static int64_t last_time;
|
||||
if (received_nb_signals)
|
||||
return AVERROR_EXIT;
|
||||
|
@ -1010,23 +1006,9 @@ static int check_keyboard_interaction(int64_t cur_time)
|
|||
(n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
|
||||
target, time, command, arg);
|
||||
for (i = 0; i < nb_filtergraphs; i++) {
|
||||
FilterGraph *fg = filtergraphs[i];
|
||||
if (fg->graph) {
|
||||
if (time < 0) {
|
||||
ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
|
||||
key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
|
||||
fprintf(stderr, "Command reply for stream %d: ret:%d res:\n%s", i, ret, buf);
|
||||
} else if (key == 'c') {
|
||||
fprintf(stderr, "Queuing commands only on filters supporting the specific command is unsupported\n");
|
||||
ret = AVERROR_PATCHWELCOME;
|
||||
} else {
|
||||
ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "Queuing command failed with error %s\n", av_err2str(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < nb_filtergraphs; i++)
|
||||
fg_send_command(filtergraphs[i], time, target, command, arg,
|
||||
key == 'C');
|
||||
} else {
|
||||
av_log(NULL, AV_LOG_ERROR,
|
||||
"Parse error, at least 3 arguments were expected, "
|
||||
|
|
|
@ -759,6 +759,9 @@ void fg_free(FilterGraph **pfg);
|
|||
*/
|
||||
int fg_transcode_step(FilterGraph *graph, InputStream **best_ist);
|
||||
|
||||
void fg_send_command(FilterGraph *fg, double time, const char *target,
|
||||
const char *command, const char *arg, int all_filters);
|
||||
|
||||
/**
|
||||
* Get and encode new output from specified filtergraph, without causing
|
||||
* activity.
|
||||
|
|
|
@ -1741,6 +1741,30 @@ int filtergraph_is_simple(const FilterGraph *fg)
|
|||
return fgp->is_simple;
|
||||
}
|
||||
|
||||
void fg_send_command(FilterGraph *fg, double time, const char *target,
|
||||
const char *command, const char *arg, int all_filters)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!fg->graph)
|
||||
return;
|
||||
|
||||
if (time < 0) {
|
||||
char response[4096];
|
||||
ret = avfilter_graph_send_command(fg->graph, target, command, arg,
|
||||
response, sizeof(response),
|
||||
all_filters ? 0 : AVFILTER_CMD_FLAG_ONE);
|
||||
fprintf(stderr, "Command reply for stream %d: ret:%d res:\n%s",
|
||||
fg->index, ret, response);
|
||||
} else if (!all_filters) {
|
||||
fprintf(stderr, "Queuing commands only on filters supporting the specific command is unsupported\n");
|
||||
} else {
|
||||
ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "Queuing command failed with error %s\n", av_err2str(ret));
|
||||
}
|
||||
}
|
||||
|
||||
static int fg_output_step(OutputFilterPriv *ofp, int flush)
|
||||
{
|
||||
FilterGraphPriv *fgp = fgp_from_fg(ofp->ofilter.graph);
|
||||
|
|
Loading…
Add table
Reference in a new issue