X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=80d2cca2b7c5144772ab70829a6df2b2298dbd14;hb=f502ff3f61dfdc7c4180b6a24cec6237c38bc148;hp=371ccd291e80a31deed46c274c62db2f6f06c703;hpb=6b474953975fd8ea64d1ed4d09c42b2d8e787c6f;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index 371ccd291e8..80d2cca2b7c 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -2,20 +2,20 @@ * FFmpeg main * Copyright (c) 2000-2003 Fabrice Bellard * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -36,9 +36,9 @@ #include "libswscale/swscale.h" #include "libavcodec/opt.h" #include "libavcodec/audioconvert.h" -#include "libavcore/audioconvert.h" -#include "libavcore/parseutils.h" -#include "libavcore/samplefmt.h" +#include "libavutil/audioconvert.h" +#include "libavutil/parseutils.h" +#include "libavutil/samplefmt.h" #include "libavutil/colorspace.h" #include "libavutil/fifo.h" #include "libavutil/intreadwrite.h" @@ -69,12 +69,7 @@ #include #endif -#if HAVE_TERMIOS_H -#include -#include -#include -#include -#elif HAVE_CONIO_H +#if HAVE_KBHIT #include #endif #include @@ -115,6 +110,8 @@ static const OptionDef options[]; #define MAX_STREAMS 1024 /* arbitrary sanity check value */ #endif +#define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h + static const char *last_asked_format = NULL; static AVFormatContext *input_files[MAX_FILES]; static int64_t input_files_ts_offset[MAX_FILES]; @@ -340,12 +337,6 @@ typedef struct AVInputFile { int nb_streams; /* nb streams we are aware of */ } AVInputFile; -#if HAVE_TERMIOS_H - -/* init terminal so that we can grab keys */ -static struct termios oldtty; -#endif - #if CONFIG_AVFILTER static int configure_filters(AVInputStream *ist, AVOutputStream *ost) @@ -423,9 +414,6 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) static void term_exit(void) { av_log(NULL, AV_LOG_QUIET, ""); -#if HAVE_TERMIOS_H - tcsetattr (0, TCSANOW, &oldtty); -#endif } static volatile int received_sigterm = 0; @@ -439,26 +427,6 @@ sigterm_handler(int sig) static void term_init(void) { -#if HAVE_TERMIOS_H - struct termios tty; - - tcgetattr (0, &tty); - oldtty = tty; - atexit(term_exit); - - tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP - |INLCR|IGNCR|ICRNL|IXON); - tty.c_oflag |= OPOST; - tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN); - tty.c_cflag &= ~(CSIZE|PARENB); - tty.c_cflag |= CS8; - tty.c_cc[VMIN] = 1; - tty.c_cc[VTIME] = 0; - - tcsetattr (0, TCSANOW, &tty); - signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */ -#endif - signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */ signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */ #ifdef SIGXCPU @@ -469,25 +437,7 @@ static void term_init(void) /* read a key without blocking */ static int read_key(void) { -#if HAVE_TERMIOS_H - int n = 1; - unsigned char ch; - struct timeval tv; - fd_set rfds; - - FD_ZERO(&rfds); - FD_SET(0, &rfds); - tv.tv_sec = 0; - tv.tv_usec = 0; - n = select(1, &rfds, NULL, NULL, &tv); - if (n > 0) { - n = read(0, &ch, 1); - if (n == 1) - return ch; - - return n; - } -#elif HAVE_CONIO_H +#if HAVE_KBHIT if(kbhit()) return(getch()); #endif @@ -506,9 +456,8 @@ static int ffmpeg_exit(int ret) /* close files */ for(i=0;ioformat->flags & AVFMT_NOFILE) && s->pb) - url_fclose(s->pb); + avio_close(s->pb); avformat_free_context(s); av_free(output_streams_for_file[i]); } @@ -524,7 +473,6 @@ static int ffmpeg_exit(int ret) fclose(vstats_file); av_free(vstats_filename); - av_free(opt_names); av_free(streamid_map); av_free(input_codecs); av_free(output_codecs); @@ -699,11 +647,6 @@ static int read_ffserver_streams(AVFormatContext *s, const char *filename) choose_pixel_fmt(st, codec); } - if(!st->codec->thread_count) - st->codec->thread_count = 1; - if(st->codec->thread_count>1) - avcodec_thread_init(st->codec, st->codec->thread_count); - if(st->codec->flags & CODEC_FLAG_BITEXACT) nopts = 1; @@ -1356,9 +1299,9 @@ static void print_report(AVFormatContext **output_files, oc = output_files[0]; - total_size = url_fsize(oc->pb); - if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too - total_size= url_ftell(oc->pb); + total_size = avio_size(oc->pb); + if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too + total_size= avio_tell(oc->pb); buf[0] = '\0'; ti1 = 1e10; @@ -1449,6 +1392,14 @@ static void print_report(AVFormatContext **output_files, } } +static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size) +{ + int fill_char = 0x00; + if (sample_fmt == AV_SAMPLE_FMT_U8) + fill_char = 0x80; + memset(buf, fill_char, size); +} + /* pkt = NULL means EOF (needed to flush decoder buffers) */ static int output_packet(AVInputStream *ist, int ist_index, AVOutputStream **ost_table, int nb_ostreams, @@ -1791,7 +1742,7 @@ static int output_packet(AVInputStream *ist, int ist_index, int frame_bytes = enc->frame_size*osize*enc->channels; if (allocated_audio_buf_size < frame_bytes) ffmpeg_exit(1); - memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes); + generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes); } ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf); @@ -1848,7 +1799,7 @@ static void print_sdp(AVFormatContext **avc, int n) { char sdp[2048]; - avf_sdp_create(avc, n, sdp, sizeof(sdp)); + av_sdp_create(avc, n, sdp, sizeof(sdp)); printf("SDP:\n%s\n", sdp); fflush(stdout); } @@ -1983,7 +1934,7 @@ static int transcode(AVFormatContext **output_files, for(i=0;inb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) { - dump_format(output_files[i], i, output_files[i]->filename, 1); + av_dump_format(output_files[i], i, output_files[i]->filename, 1); fprintf(stderr, "Output file #%d does not contain any stream\n", i); ret = AVERROR(EINVAL); goto fail; @@ -2034,7 +1985,7 @@ static int transcode(AVFormatContext **output_files, /* Sanity check that the stream types match */ if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) { int i= ost->file_index; - dump_format(output_files[i], i, output_files[i]->filename, 1); + av_dump_format(output_files[i], i, output_files[i]->filename, 1); fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n", stream_maps[n].file_index, stream_maps[n].stream_index, ost->file_index, ost->index); @@ -2085,7 +2036,7 @@ static int transcode(AVFormatContext **output_files, } if (!found) { int i= ost->file_index; - dump_format(output_files[i], i, output_files[i]->filename, 1); + av_dump_format(output_files[i], i, output_files[i]->filename, 1); fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n", ost->file_index, ost->index); ffmpeg_exit(1); @@ -2159,6 +2110,7 @@ static int transcode(AVFormatContext **output_files, codec->sample_rate = icodec->sample_rate; codec->channels = icodec->channels; codec->frame_size = icodec->frame_size; + codec->audio_service_type = icodec->audio_service_type; codec->block_align= icodec->block_align; if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3) codec->block_align= 0; @@ -2465,7 +2417,7 @@ static int transcode(AVFormatContext **output_files, /* dump the file output parameters - cannot be done before in case of stream copy */ for(i=0;ifilename, 1); + av_dump_format(output_files[i], i, output_files[i]->filename, 1); } /* dump the stream mapping */ @@ -2496,8 +2448,12 @@ static int transcode(AVFormatContext **output_files, } if (!using_stdin && verbose >= 0) { +#if HAVE_KBHIT fprintf(stderr, "Press [q] to stop encoding\n"); - url_set_interrupt_cb(decode_interrupt_cb); +#else + fprintf(stderr, "Press ctrl-c to stop encoding\n"); +#endif + avio_set_interrupt_cb(decode_interrupt_cb); } term_init(); @@ -2561,7 +2517,7 @@ static int transcode(AVFormatContext **output_files, } /* finish if limit size exhausted */ - if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb)) + if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb)) break; /* read a frame from it and output it in the fifo */ @@ -2584,7 +2540,8 @@ static int transcode(AVFormatContext **output_files, memset(no_packet, 0, sizeof(no_packet)); if (do_pkt_dump) { - av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump); + av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump, + is->streams[pkt.stream_index]); } /* the following test is needed in case new streams appear dynamically in stream : we ignore them */ @@ -3237,7 +3194,7 @@ static void opt_input_file(const char *filename) for(i=0;inb_streams;i++) { AVStream *st = ic->streams[i]; AVCodecContext *dec = st->codec; - avcodec_thread_init(dec, thread_count); + dec->thread_count = thread_count; input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1); switch (dec->codec_type) { case AVMEDIA_TYPE_AUDIO: @@ -3315,7 +3272,7 @@ static void opt_input_file(const char *filename) input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp); /* dump the file content */ if (verbose >= 0) - dump_format(ic, nb_input_files, filename, 0); + av_dump_format(ic, nb_input_files, filename, 0); nb_input_files++; @@ -3395,7 +3352,7 @@ static void new_video_stream(AVFormatContext *oc, int file_idx) ost->bitstream_filters = video_bitstream_filters; video_bitstream_filters= NULL; - avcodec_thread_init(st->codec, thread_count); + st->codec->thread_count= thread_count; video_enc = st->codec; @@ -3542,7 +3499,7 @@ static void new_audio_stream(AVFormatContext *oc, int file_idx) ost->bitstream_filters = audio_bitstream_filters; audio_bitstream_filters= NULL; - avcodec_thread_init(st->codec, thread_count); + st->codec->thread_count= thread_count; audio_enc = st->codec; audio_enc->codec_type = AVMEDIA_TYPE_AUDIO; @@ -3795,7 +3752,7 @@ static void opt_output_file(const char *filename) } /* open the file */ - if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) { + if ((err = avio_open(&oc->pb, filename, AVIO_WRONLY)) < 0) { print_error(filename, err); ffmpeg_exit(1); } @@ -4187,7 +4144,7 @@ static const OptionDef options[] = { { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" }, { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" }, { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" }, - { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" }, + { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" }, { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile", "outfile[,metadata]:infile[,metadata]" }, { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile", @@ -4251,7 +4208,7 @@ static const OptionDef options[] = { { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" }, { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" }, { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, - "use same video quality as source (implies VBR)" }, + "use same quantizer as source (implies VBR)" }, { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" }, { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" }, { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace}, @@ -4334,7 +4291,7 @@ int main(int argc, char **argv) #if HAVE_ISATTY if(isatty(STDIN_FILENO)) - url_set_interrupt_cb(decode_interrupt_cb); + avio_set_interrupt_cb(decode_interrupt_cb); #endif init_opts();