static int subtitle_disable = 0;
static char *subtitle_codec_name = NULL;
static char *subtitle_language = NULL;
+static int subtitle_codec_tag = 0;
static float mux_preload= 0.5;
static float mux_max_delay= 0.7;
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;
powerpc_display_perf_report();
#endif /* CONFIG_POWERPC_PERF */
+ for (i=0;i<CODEC_TYPE_NB;i++)
+ av_free(avcodec_opts[i]);
+ av_free(avformat_opts);
+ av_free(sws_opts);
+ av_free(audio_buf);
+ av_free(audio_out);
+ av_free(audio_out2);
+ av_free(samples);
+
if (received_sigterm) {
fprintf(stderr,
"Received signal %d: terminating.\n",
unsigned char *buf, int size)
{
uint8_t *buftmp;
- static uint8_t *audio_buf = NULL;
- static uint8_t *audio_out = NULL;
- static uint8_t *audio_out2 = NULL;
const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
int size_out, frame_bytes, ret;
AVPacket pkt;
av_init_packet(&pkt);
- av_fifo_generic_read(ost->fifo, frame_bytes, NULL, audio_buf);
+ av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
//FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
{
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 */
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) {
/* 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;
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;
}
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;
} 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)
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;
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;
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);
- av_fifo_generic_read(ost->fifo, fifo_bytes, NULL, samples);
- ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
+ 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);
+ 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) {
int nb_input_files,
AVStreamMap *stream_maps, int nb_stream_maps)
{
- int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
+ int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
AVFormatContext *is, *os;
AVCodecContext *codec, *icodec;
AVOutputStream *ost, **ost_table = NULL;
AVInputStream *ist, **ist_table = NULL;
AVInputFile *file_table;
+ char error[1024];
int key;
int want_sdp = 1;
uint8_t no_packet[MAX_FILES]={0};
if (!bit_buffer)
bit_buffer = av_malloc(bit_buffer_size);
- if (!bit_buffer)
+ if (!bit_buffer) {
+ ret = AVERROR(ENOMEM);
goto fail;
-
- /* dump the file output parameters - cannot be done before in case
- of stream copy */
- for(i=0;i<nb_output_files;i++) {
- dump_format(output_files[i], i, output_files[i]->filename, 1);
- }
-
- /* dump the stream mapping */
- if (verbose >= 0) {
- fprintf(stderr, "Stream mapping:\n");
- for(i=0;i<nb_ostreams;i++) {
- ost = ost_table[i];
- fprintf(stderr, " Stream #%d.%d -> #%d.%d",
- ist_table[ost->source_index]->file_index,
- ist_table[ost->source_index]->index,
- ost->file_index,
- ost->index);
- if (ost->sync_ist != ist_table[ost->source_index])
- fprintf(stderr, " [sync #%d.%d]",
- ost->sync_ist->file_index,
- ost->sync_ist->index);
- fprintf(stderr, "\n");
- }
}
/* open each encoder */
if (!codec)
codec = avcodec_find_encoder(ost->st->codec->codec_id);
if (!codec) {
- fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
+ snprintf(error, sizeof(error), "Unsupported codec for output stream #%d.%d",
ost->file_index, ost->index);
- av_exit(1);
+ ret = AVERROR(EINVAL);
+ goto dump_format;
}
if (avcodec_open(ost->st->codec, codec) < 0) {
- fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
+ snprintf(error, sizeof(error), "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
ost->file_index, ost->index);
- av_exit(1);
+ ret = AVERROR(EINVAL);
+ goto dump_format;
}
extra_size += ost->st->codec->extradata_size;
}
if (!codec)
codec = avcodec_find_decoder(ist->st->codec->codec_id);
if (!codec) {
- fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
+ snprintf(error, sizeof(error), "Unsupported codec (id=%d) for input stream #%d.%d",
ist->st->codec->codec_id, ist->file_index, ist->index);
- av_exit(1);
+ ret = AVERROR(EINVAL);
+ goto dump_format;
}
if (avcodec_open(ist->st->codec, codec) < 0) {
- fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
+ snprintf(error, sizeof(error), "Error while opening codec for input stream #%d.%d",
ist->file_index, ist->index);
- av_exit(1);
+ ret = AVERROR(EINVAL);
+ goto dump_format;
}
//if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
// ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
int out_file_index = meta_data_maps[i].out_file;
int in_file_index = meta_data_maps[i].in_file;
if (out_file_index < 0 || out_file_index >= nb_output_files) {
- fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
+ snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
+ out_file_index, out_file_index, in_file_index);
ret = AVERROR(EINVAL);
- goto fail;
+ goto dump_format;
}
if (in_file_index < 0 || in_file_index >= nb_input_files) {
- fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
+ snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
+ in_file_index, out_file_index, in_file_index);
ret = AVERROR(EINVAL);
- goto fail;
+ goto dump_format;
}
out_file = output_files[out_file_index];
for(i=0;i<nb_output_files;i++) {
os = output_files[i];
if (av_write_header(os) < 0) {
- fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
+ snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
ret = AVERROR(EINVAL);
- goto fail;
+ goto dump_format;
}
if (strcmp(output_files[i]->oformat->name, "rtp")) {
want_sdp = 0;
}
}
+
+ dump_format:
+ /* dump the file output parameters - cannot be done before in case
+ of stream copy */
+ for(i=0;i<nb_output_files;i++) {
+ dump_format(output_files[i], i, output_files[i]->filename, 1);
+ }
+
+ /* dump the stream mapping */
+ if (verbose >= 0) {
+ fprintf(stderr, "Stream mapping:\n");
+ for(i=0;i<nb_ostreams;i++) {
+ ost = ost_table[i];
+ fprintf(stderr, " Stream #%d.%d -> #%d.%d",
+ ist_table[ost->source_index]->file_index,
+ ist_table[ost->source_index]->index,
+ ost->file_index,
+ ost->index);
+ if (ost->sync_ist != ist_table[ost->source_index])
+ fprintf(stderr, " [sync #%d.%d]",
+ ost->sync_ist->file_index,
+ ost->sync_ist->index);
+ fprintf(stderr, "\n");
+ }
+ }
+
+ if (ret) {
+ fprintf(stderr, "%s\n", error);
+ goto fail;
+ }
+
if (want_sdp) {
print_sdp(output_files, nb_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;
}
/* finished ! */
-
ret = 0;
- fail1:
+
+ fail:
av_freep(&bit_buffer);
av_free(file_table);
av_free(ost_table);
}
return ret;
- fail:
- ret = AVERROR(ENOMEM);
- goto fail1;
}
#if 0
return 0;
}
+static void 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);
+}
+
static int opt_verbose(const char *opt, const char *arg)
{
verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
- av_log_set_level(verbose);
return 0;
}
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);
}
opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
}
+static void opt_subtitle_tag(const char *arg)
+{
+ char *tail;
+ subtitle_codec_tag= strtol(arg, &tail, 0);
+
+ if(!tail || *tail)
+ subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
+}
+
static void opt_map(const char *arg)
{
AVStreamMap *m;
subtitle_enc = st->codec;
subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
+
+ if(subtitle_codec_tag)
+ subtitle_enc->codec_tag= subtitle_codec_tag;
+
if (subtitle_stream_copy) {
st->stream_copy = 1;
} else {
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);
}
{ "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
{ "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
{ "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
- { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
+ { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
+ { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "number" },
{ "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
{ "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
{ "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
{ "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
{ "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
{ "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
+ { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
/* grab options */
{ "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },