X-Git-Url: http://rtime.felk.cvut.cz/gitweb/frescor/ffmpeg.git/blobdiff_plain/dd322c686c8902a0fa8b2f86bf3e57dc2a3f09ad..08ea1a57be5f25f15def4d03e90ce68f2712d49a:/ffmpeg.c diff --git a/ffmpeg.c b/ffmpeg.c index c4f910d1c..5f407c96c 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -222,6 +222,12 @@ static unsigned int sws_flags = SWS_BICUBIC; static int64_t timer_start; +static uint8_t *audio_buf; +static uint8_t *audio_out; +static uint8_t *audio_out2; + +static short *samples; + static AVBitStreamFilterContext *video_bitstream_filters=NULL; static AVBitStreamFilterContext *audio_bitstream_filters=NULL; static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL; @@ -427,6 +433,15 @@ static int av_exit(int ret) powerpc_display_perf_report(); #endif /* CONFIG_POWERPC_PERF */ + for (i=0;ifile_index]; enc = ost->st->codec; if (vid && enc->codec_type == CODEC_TYPE_VIDEO) { snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", @@ -1174,39 +1185,38 @@ static int output_packet(AVInputStream *ist, int ist_index, { AVFormatContext *os; AVOutputStream *ost; - uint8_t *ptr; - int len, ret, i; + int ret, i; uint8_t *data_buf; int data_size, got_picture; AVFrame picture; void *buffer_to_free; static unsigned int samples_size= 0; - static short *samples= NULL; AVSubtitle subtitle, *subtitle_to_free; int got_subtitle; + AVPacket avpkt; if(ist->next_pts == AV_NOPTS_VALUE) ist->next_pts= ist->pts; if (pkt == NULL) { /* EOF handling */ - ptr = NULL; - len = 0; + av_init_packet(&avpkt); + avpkt.data = NULL; + avpkt.size = 0; goto handle_eof; + } else { + avpkt = *pkt; } if(pkt->dts != AV_NOPTS_VALUE) ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q); - len = pkt->size; - ptr = pkt->data; - //while we have more to decode or while the decoder did output something on EOF - while (len > 0 || (!pkt && ist->next_pts != ist->pts)) { + while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) { handle_eof: ist->pts= ist->next_pts; - if(len && len != pkt->size && verbose>0) + if(avpkt.size && avpkt.size != pkt->size && verbose>0) fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index); /* decode the packet if needed */ @@ -1224,12 +1234,12 @@ static int output_packet(AVInputStream *ist, int ist_index, data_size= samples_size; /* XXX: could avoid copy if PCM 16 bits with same endianness as CPU */ - ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size, - ptr, len); + ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size, + &avpkt); if (ret < 0) goto fail_decode; - ptr += ret; - len -= ret; + avpkt.data += ret; + avpkt.size -= ret; /* Some bug in mpeg audio decoder gives */ /* data_size < 0, it seems they are overflows */ if (data_size <= 0) { @@ -1245,8 +1255,8 @@ static int output_packet(AVInputStream *ist, int ist_index, /* XXX: allocate picture correctly */ avcodec_get_frame_defaults(&picture); - ret = avcodec_decode_video(ist->st->codec, - &picture, &got_picture, ptr, len); + ret = avcodec_decode_video2(ist->st->codec, + &picture, &got_picture, &avpkt); ist->st->quality= picture.quality; if (ret < 0) goto fail_decode; @@ -1260,18 +1270,18 @@ static int output_packet(AVInputStream *ist, int ist_index, ist->st->codec->time_base.num * ticks) / ist->st->codec->time_base.den; } - len = 0; + avpkt.size = 0; break; case CODEC_TYPE_SUBTITLE: - ret = avcodec_decode_subtitle(ist->st->codec, - &subtitle, &got_subtitle, ptr, len); + ret = avcodec_decode_subtitle2(ist->st->codec, + &subtitle, &got_subtitle, &avpkt); if (ret < 0) goto fail_decode; if (!got_subtitle) { goto discard_packet; } subtitle_to_free = &subtitle; - len = 0; + avpkt.size = 0; break; default: goto fail_decode; @@ -1291,10 +1301,10 @@ static int output_packet(AVInputStream *ist, int ist_index, } break; } - data_buf = ptr; - data_size = len; - ret = len; - len = 0; + data_buf = avpkt.data; + data_size = avpkt.size; + ret = avpkt.size; + avpkt.size = 0; } buffer_to_free = NULL; @@ -1364,6 +1374,8 @@ static int output_packet(AVInputStream *ist, int ist_index, } else { AVFrame avframe; //FIXME/XXX remove this AVPacket opkt; + int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base); + av_init_packet(&opkt); if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes) @@ -1385,7 +1397,7 @@ static int output_packet(AVInputStream *ist, int ist_index, opkt.stream_index= ost->index; if(pkt->pts != AV_NOPTS_VALUE) - opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base); + opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time; else opkt.pts= AV_NOPTS_VALUE; @@ -1393,6 +1405,7 @@ static int output_packet(AVInputStream *ist, int ist_index, opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base); else opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base); + opkt.dts -= ost_tb_start_time; opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base); opkt.flags= pkt->flags; @@ -1451,10 +1464,13 @@ static int output_packet(AVInputStream *ist, int ist_index, ret = 0; /* encode any samples remaining in fifo */ if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) { + int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3; int fs_tmp = enc->frame_size; - enc->frame_size = fifo_bytes / (2 * enc->channels); + enc->frame_size = fifo_bytes / (osize * enc->channels); av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL); - ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples); + ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples); + pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den, + ost->st->time_base.num, enc->sample_rate); enc->frame_size = fs_tmp; } if(ret <= 0) { @@ -1732,6 +1748,8 @@ static int av_encode(AVFormatContext **output_files, av_metadata_set(&ost->st->metadata, "language", lang->value); ost->st->disposition = ist->st->disposition; + codec->bits_per_raw_sample= icodec->bits_per_raw_sample; + codec->chroma_sample_location = icodec->chroma_sample_location; if (ost->st->stream_copy) { /* if stream_copy is selected, no need to decode or encode */ @@ -1841,6 +1859,7 @@ static int av_encode(AVFormatContext **output_files, av_exit(1); } ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand); + codec->bits_per_raw_sample= 0; } ost->encoding_needed = 1; ist->decoding_needed = 1; @@ -1956,7 +1975,6 @@ static int av_encode(AVFormatContext **output_files, /* init pts */ for(i=0;ifile_index]; ist->pts = 0; ist->next_pts = AV_NOPTS_VALUE; ist->is_start = 1; @@ -2047,7 +2065,6 @@ static int av_encode(AVFormatContext **output_files, } term_init(); - key = -1; timer_start = av_gettime(); for(; received_sigterm == 0;) { @@ -2121,7 +2138,7 @@ static int av_encode(AVFormatContext **output_files, /* read a frame from it and output it in the fifo */ is = input_files[file_index]; ret= av_read_frame(is, &pkt); - if(ret == AVERROR(EAGAIN) && strcmp(is->iformat->name, "ffm")){ + if(ret == AVERROR(EAGAIN)){ no_packet[file_index]=1; no_packet_count++; continue; @@ -2321,10 +2338,11 @@ static int opt_me_threshold(const char *opt, const char *arg) return 0; } -static void opt_loglevel(const char *opt, const char *arg) +static int opt_loglevel(const char *opt, const char *arg) { int level = parse_number_or_die(opt, arg, OPT_INT, INT_MIN, INT_MAX); av_log_set_level(level); + return 0; } static int opt_verbose(const char *opt, const char *arg) @@ -2536,9 +2554,13 @@ static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), static void opt_frame_pix_fmt(const char *arg) { - if (strcmp(arg, "list")) + if (strcmp(arg, "list")) { frame_pix_fmt = avcodec_get_pix_fmt(arg); - else { + if (frame_pix_fmt == PIX_FMT_NONE) { + fprintf(stderr, "Unknown pixel format requested: %s\n", arg); + av_exit(1); + } + } else { list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB); av_exit(0); } @@ -3194,6 +3216,8 @@ static void new_audio_stream(AVFormatContext *oc) audio_enc->channels = audio_channels; audio_enc->sample_fmt = audio_sample_fmt; audio_enc->channel_layout = channel_layout; + if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels) + audio_enc->channel_layout = 0; if(codec && codec->sample_fmts){ const enum SampleFormat *p= codec->sample_fmts; @@ -3394,18 +3418,13 @@ static void opt_output_file(const char *filename) filename[1] == ':' || av_strstart(filename, "file:", NULL))) { if (url_exist(filename)) { - int c; - if (!using_stdin) { fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename); fflush(stderr); - c = getchar(); - if (toupper(c) != 'Y') { + if (!read_yesno()) { fprintf(stderr, "Not overwriting - exiting\n"); av_exit(1); } - while (c != '\n' && c != EOF) - c = getchar(); } else { fprintf(stderr,"File '%s' already exists. Exiting.\n", filename); @@ -3801,8 +3820,8 @@ static const OptionDef options[] = { { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" }, { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" }, { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" }, - { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" }, - { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)&opt_metadata}, "add metadata", "string=string" }, + { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" }, + { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" }, { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" }, { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark}, "add timings for benchmarking" },