diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-06-06 15:56:34 +0200 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-06-07 17:13:02 +0200 |
commit | 25e87fc5f61bd9b85ecf52c6082a18d7e7c8506b (patch) | |
tree | da4e46dc8cfb392ae56ec2f89306400caadb434c /ffmpeg.c | |
parent | 9915a33fc2c90b314fe696a1260e2bbb58827e67 (diff) | |
download | ffmpeg-25e87fc5f61bd9b85ecf52c6082a18d7e7c8506b.tar.gz |
ffmpeg: move keyboard interaction in a function.
It makes the transcode loop easier to read (30% less code)
and the differences with avconv easier to spot.
Diffstat (limited to 'ffmpeg.c')
-rw-r--r-- | ffmpeg.c | 184 |
1 files changed, 95 insertions, 89 deletions
@@ -3210,6 +3210,99 @@ static int select_input_file(uint8_t *no_packet) return file_index; } +static int check_keyboard_interaction(int64_t cur_time) +{ + int i, ret, key; + static int64_t last_time; + if (received_nb_signals) + return AVERROR_EXIT; + /* read_key() returns 0 on EOF */ + if(cur_time - last_time >= 100000 && !run_as_daemon){ + key = read_key(); + last_time = cur_time; + }else + key = -1; + if (key == 'q') + return AVERROR_EXIT; + if (key == '+') av_log_set_level(av_log_get_level()+10); + if (key == '-') av_log_set_level(av_log_get_level()-10); + if (key == 's') qp_hist ^= 1; + if (key == 'h'){ + if (do_hex_dump){ + do_hex_dump = do_pkt_dump = 0; + } else if(do_pkt_dump){ + do_hex_dump = 1; + } else + do_pkt_dump = 1; + av_log_set_level(AV_LOG_DEBUG); + } + if (key == 'c' || key == 'C'){ + char buf[4096], target[64], command[256], arg[256] = {0}; + double time; + int k, n = 0; + fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n"); + i = 0; + while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1) + if (k > 0) + buf[i++] = k; + buf[i] = 0; + if (k > 0 && + (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:%s\n", i, ret, buf); + } else { + ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time); + } + } + } + } else { + av_log(NULL, AV_LOG_ERROR, + "Parse error, at least 3 arguments were expected, " + "only %d given in string '%s'\n", n, buf); + } + } + if (key == 'd' || key == 'D'){ + int debug=0; + if(key == 'D') { + debug = input_streams[0]->st->codec->debug<<1; + if(!debug) debug = 1; + while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash + debug += debug; + }else + if(scanf("%d", &debug)!=1) + fprintf(stderr,"error parsing debug value\n"); + for(i=0;i<nb_input_streams;i++) { + input_streams[i]->st->codec->debug = debug; + } + for(i=0;i<nb_output_streams;i++) { + OutputStream *ost = output_streams[i]; + ost->st->codec->debug = debug; + } + if(debug) av_log_set_level(AV_LOG_DEBUG); + fprintf(stderr,"debug=%d\n", debug); + } + if (key == '?'){ + fprintf(stderr, "key function\n" + "? show this help\n" + "+ increase verbosity\n" + "- decrease verbosity\n" + "c Send command to filtergraph\n" + "D cycle through available debug modes\n" + "h dump packets/hex press to cycle through the 3 states\n" + "q quit\n" + "s Show QP histogram\n" + ); + } + return 0; +} + /* * The following code is the main loop of the file converter */ @@ -3222,7 +3315,6 @@ static int transcode(void) uint8_t *no_packet; int no_packet_count = 0; int64_t timer_start; - int key; if (!(no_packet = av_mallocz(nb_input_files))) exit_program(1); @@ -3243,95 +3335,9 @@ static int transcode(void) int64_t cur_time= av_gettime(); /* if 'q' pressed, exits */ - if (!using_stdin) { - static int64_t last_time; - if (received_nb_signals) - break; - /* read_key() returns 0 on EOF */ - if(cur_time - last_time >= 100000 && !run_as_daemon){ - key = read_key(); - last_time = cur_time; - }else - key = -1; - if (key == 'q') + if (!using_stdin) + if (check_keyboard_interaction(cur_time) < 0) break; - if (key == '+') av_log_set_level(av_log_get_level()+10); - if (key == '-') av_log_set_level(av_log_get_level()-10); - if (key == 's') qp_hist ^= 1; - if (key == 'h'){ - if (do_hex_dump){ - do_hex_dump = do_pkt_dump = 0; - } else if(do_pkt_dump){ - do_hex_dump = 1; - } else - do_pkt_dump = 1; - av_log_set_level(AV_LOG_DEBUG); - } - if (key == 'c' || key == 'C'){ - char buf[4096], target[64], command[256], arg[256] = {0}; - double time; - int k, n = 0; - fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n"); - i = 0; - while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1) - if (k > 0) - buf[i++] = k; - buf[i] = 0; - if (k > 0 && - (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:%s\n", i, ret, buf); - } else { - ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time); - } - } - } - } else { - av_log(NULL, AV_LOG_ERROR, - "Parse error, at least 3 arguments were expected, " - "only %d given in string '%s'\n", n, buf); - } - } - if (key == 'd' || key == 'D'){ - int debug=0; - if(key == 'D') { - debug = input_streams[0]->st->codec->debug<<1; - if(!debug) debug = 1; - while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash - debug += debug; - }else - if(scanf("%d", &debug)!=1) - fprintf(stderr,"error parsing debug value\n"); - for(i=0;i<nb_input_streams;i++) { - input_streams[i]->st->codec->debug = debug; - } - for(i=0;i<nb_output_streams;i++) { - ost = output_streams[i]; - ost->st->codec->debug = debug; - } - if(debug) av_log_set_level(AV_LOG_DEBUG); - fprintf(stderr,"debug=%d\n", debug); - } - if (key == '?'){ - fprintf(stderr, "key function\n" - "? show this help\n" - "+ increase verbosity\n" - "- decrease verbosity\n" - "c Send command to filtergraph\n" - "D cycle through available debug modes\n" - "h dump packets/hex press to cycle through the 3 states\n" - "q quit\n" - "s Show QP histogram\n" - ); - } - } /* check if there's any stream where output is still needed */ if (!need_output()) { |