You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: avconv: Fix spelling errors. aac: Only set sample rate and object type from ADTS if output hasn't been configured. aac: Set SBR and PS to unsignalled during headerless and ADTS initialization. aac: Only output configure if audio was found. avconv: save two levels of indentation in flush_encoders() avconv: factor flushing encoders out of output_packet(). avconv: factor out initializing input streams. avconv: remove -intra option. avconv: reset streamid_map between output files. avconv: make timer_start a local var in transcode(). avconv: cosmetics, move OutputStream. avconv: remove two unused macros. Conflicts: avconv.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -41,6 +41,7 @@ easier to use. The changes are:
|
|||||||
* Presets in avconv are disabled, because only libx264 used them and
|
* Presets in avconv are disabled, because only libx264 used them and
|
||||||
presets for libx264 can now be specified using a private option
|
presets for libx264 can now be specified using a private option
|
||||||
'-preset <presetname>'.
|
'-preset <presetname>'.
|
||||||
|
* -intra option was removed, it's equivalent to -g 0.
|
||||||
- XMV demuxer
|
- XMV demuxer
|
||||||
|
|
||||||
|
|
||||||
|
319
avconv.c
319
avconv.c
@@ -157,7 +157,6 @@ static int qp_hist = 0;
|
|||||||
static char *vfilters = NULL;
|
static char *vfilters = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int intra_only = 0;
|
|
||||||
static int audio_sample_rate = 0;
|
static int audio_sample_rate = 0;
|
||||||
#define QSCALE_NONE -99999
|
#define QSCALE_NONE -99999
|
||||||
static float audio_qscale = QSCALE_NONE;
|
static float audio_qscale = QSCALE_NONE;
|
||||||
@@ -220,8 +219,6 @@ static char *forced_key_frames = NULL;
|
|||||||
|
|
||||||
static float dts_delta_threshold = 10;
|
static float dts_delta_threshold = 10;
|
||||||
|
|
||||||
static int64_t timer_start;
|
|
||||||
|
|
||||||
static uint8_t *audio_buf;
|
static uint8_t *audio_buf;
|
||||||
static uint8_t *audio_out;
|
static uint8_t *audio_out;
|
||||||
static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
|
static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
|
||||||
@@ -234,7 +231,31 @@ static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
|
|||||||
|
|
||||||
#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
|
#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
|
||||||
|
|
||||||
struct InputStream;
|
typedef struct InputStream {
|
||||||
|
int file_index;
|
||||||
|
AVStream *st;
|
||||||
|
int discard; /* true if stream data should be discarded */
|
||||||
|
int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
|
||||||
|
AVCodec *dec;
|
||||||
|
|
||||||
|
int64_t start; /* time when read started */
|
||||||
|
int64_t next_pts; /* synthetic pts for cases where pkt.pts
|
||||||
|
is not defined */
|
||||||
|
int64_t pts; /* current pts */
|
||||||
|
double ts_scale;
|
||||||
|
int is_start; /* is 1 at the start and after a discontinuity */
|
||||||
|
int showed_multi_packet_warning;
|
||||||
|
AVDictionary *opts;
|
||||||
|
} InputStream;
|
||||||
|
|
||||||
|
typedef struct InputFile {
|
||||||
|
AVFormatContext *ctx;
|
||||||
|
int eof_reached; /* true if eof reached */
|
||||||
|
int ist_index; /* index of first stream in ist_table */
|
||||||
|
int buffer_size; /* current total buffer size */
|
||||||
|
int nb_streams;
|
||||||
|
int64_t ts_offset;
|
||||||
|
} InputFile;
|
||||||
|
|
||||||
typedef struct OutputStream {
|
typedef struct OutputStream {
|
||||||
int file_index; /* file index */
|
int file_index; /* file index */
|
||||||
@@ -291,32 +312,6 @@ typedef struct OutputStream {
|
|||||||
int is_past_recording_time;
|
int is_past_recording_time;
|
||||||
} OutputStream;
|
} OutputStream;
|
||||||
|
|
||||||
typedef struct InputStream {
|
|
||||||
int file_index;
|
|
||||||
AVStream *st;
|
|
||||||
int discard; /* true if stream data should be discarded */
|
|
||||||
int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
|
|
||||||
AVCodec *dec;
|
|
||||||
|
|
||||||
int64_t start; /* time when read started */
|
|
||||||
int64_t next_pts; /* synthetic pts for cases where pkt.pts
|
|
||||||
is not defined */
|
|
||||||
int64_t pts; /* current pts */
|
|
||||||
double ts_scale;
|
|
||||||
int is_start; /* is 1 at the start and after a discontinuity */
|
|
||||||
int showed_multi_packet_warning;
|
|
||||||
AVDictionary *opts;
|
|
||||||
} InputStream;
|
|
||||||
|
|
||||||
typedef struct InputFile {
|
|
||||||
AVFormatContext *ctx;
|
|
||||||
int eof_reached; /* true if eof reached */
|
|
||||||
int ist_index; /* index of first stream in ist_table */
|
|
||||||
int buffer_size; /* current total buffer size */
|
|
||||||
int nb_streams;
|
|
||||||
int64_t ts_offset;
|
|
||||||
} InputFile;
|
|
||||||
|
|
||||||
#if HAVE_TERMIOS_H
|
#if HAVE_TERMIOS_H
|
||||||
|
|
||||||
/* init terminal so that we can grab keys */
|
/* init terminal so that we can grab keys */
|
||||||
@@ -419,7 +414,7 @@ static int configure_video_filters(InputStream *ist, OutputStream *ost)
|
|||||||
codec->width = ost->output_video_filter->inputs[0]->w;
|
codec->width = ost->output_video_filter->inputs[0]->w;
|
||||||
codec->height = ost->output_video_filter->inputs[0]->h;
|
codec->height = ost->output_video_filter->inputs[0]->h;
|
||||||
codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
|
codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
|
||||||
ost->frame_aspect_ratio ? // overriden by the -aspect cli option
|
ost->frame_aspect_ratio ? // overridden by the -aspect cli option
|
||||||
av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
|
av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
|
||||||
ost->output_video_filter->inputs[0]->sample_aspect_ratio;
|
ost->output_video_filter->inputs[0]->sample_aspect_ratio;
|
||||||
|
|
||||||
@@ -539,7 +534,6 @@ static int exit_program(int ret)
|
|||||||
fclose(vstats_file);
|
fclose(vstats_file);
|
||||||
av_free(vstats_filename);
|
av_free(vstats_filename);
|
||||||
|
|
||||||
av_free(streamid_map);
|
|
||||||
av_free(meta_data_maps);
|
av_free(meta_data_maps);
|
||||||
|
|
||||||
av_freep(&input_streams);
|
av_freep(&input_streams);
|
||||||
@@ -723,8 +717,6 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_AUDIO_PACKET_SIZE (128 * 1024)
|
|
||||||
|
|
||||||
static void do_audio_out(AVFormatContext *s,
|
static void do_audio_out(AVFormatContext *s,
|
||||||
OutputStream *ost,
|
OutputStream *ost,
|
||||||
InputStream *ist,
|
InputStream *ist,
|
||||||
@@ -1008,9 +1000,6 @@ static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void *
|
|||||||
*bufp = buf;
|
*bufp = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we begin to correct av delay at this threshold */
|
|
||||||
#define AV_DELAY_MAX 0.100
|
|
||||||
|
|
||||||
static void do_subtitle_out(AVFormatContext *s,
|
static void do_subtitle_out(AVFormatContext *s,
|
||||||
OutputStream *ost,
|
OutputStream *ost,
|
||||||
InputStream *ist,
|
InputStream *ist,
|
||||||
@@ -1135,7 +1124,7 @@ static void do_video_resample(OutputStream *ost,
|
|||||||
if (resample_changed) {
|
if (resample_changed) {
|
||||||
avfilter_graph_free(&ost->graph);
|
avfilter_graph_free(&ost->graph);
|
||||||
if (configure_video_filters(ist, ost)) {
|
if (configure_video_filters(ist, ost)) {
|
||||||
fprintf(stderr, "Error reinitialising filters!\n");
|
fprintf(stderr, "Error reinitializing filters!\n");
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1212,7 +1201,7 @@ static void do_video_out(AVFormatContext *s,
|
|||||||
|
|
||||||
if (s->oformat->flags & AVFMT_RAWPICTURE) {
|
if (s->oformat->flags & AVFMT_RAWPICTURE) {
|
||||||
/* raw pictures are written as AVPicture structure to
|
/* raw pictures are written as AVPicture structure to
|
||||||
avoid any copies. We support temorarily the older
|
avoid any copies. We support temporarily the older
|
||||||
method. */
|
method. */
|
||||||
AVFrame* old_frame = enc->coded_frame;
|
AVFrame* old_frame = enc->coded_frame;
|
||||||
enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
|
enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
|
||||||
@@ -1329,7 +1318,7 @@ static void do_video_stats(AVFormatContext *os, OutputStream *ost,
|
|||||||
|
|
||||||
static void print_report(OutputFile *output_files,
|
static void print_report(OutputFile *output_files,
|
||||||
OutputStream *ost_table, int nb_ostreams,
|
OutputStream *ost_table, int nb_ostreams,
|
||||||
int is_last_report)
|
int is_last_report, int64_t timer_start)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
@@ -1466,6 +1455,91 @@ static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_
|
|||||||
memset(buf, fill_char, size);
|
memset(buf, fill_char, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void flush_encoders(int ist_index, OutputStream *ost_table, int nb_ostreams)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
for (i = 0; i < nb_ostreams; i++) {
|
||||||
|
OutputStream *ost = &ost_table[i];
|
||||||
|
AVCodecContext *enc = ost->st->codec;
|
||||||
|
AVFormatContext *os = output_files[ost->file_index].ctx;
|
||||||
|
|
||||||
|
if (ost->source_index != ist_index || !ost->encoding_needed)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
|
||||||
|
continue;
|
||||||
|
if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
AVPacket pkt;
|
||||||
|
int fifo_bytes;
|
||||||
|
av_init_packet(&pkt);
|
||||||
|
pkt.stream_index= ost->index;
|
||||||
|
|
||||||
|
switch (ost->st->codec->codec_type) {
|
||||||
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
|
fifo_bytes = av_fifo_size(ost->fifo);
|
||||||
|
ret = 0;
|
||||||
|
/* encode any samples remaining in fifo */
|
||||||
|
if (fifo_bytes > 0) {
|
||||||
|
int osize = av_get_bytes_per_sample(enc->sample_fmt);
|
||||||
|
int fs_tmp = enc->frame_size;
|
||||||
|
|
||||||
|
av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
|
||||||
|
if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
|
||||||
|
enc->frame_size = fifo_bytes / (osize * enc->channels);
|
||||||
|
} else { /* pad */
|
||||||
|
int frame_bytes = enc->frame_size*osize*enc->channels;
|
||||||
|
if (allocated_audio_buf_size < frame_bytes)
|
||||||
|
exit_program(1);
|
||||||
|
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);
|
||||||
|
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) {
|
||||||
|
ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
|
||||||
|
}
|
||||||
|
if (ret < 0) {
|
||||||
|
fprintf(stderr, "Audio encoding failed\n");
|
||||||
|
exit_program(1);
|
||||||
|
}
|
||||||
|
audio_size += ret;
|
||||||
|
pkt.flags |= AV_PKT_FLAG_KEY;
|
||||||
|
break;
|
||||||
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
|
ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
|
||||||
|
if (ret < 0) {
|
||||||
|
fprintf(stderr, "Video encoding failed\n");
|
||||||
|
exit_program(1);
|
||||||
|
}
|
||||||
|
video_size += ret;
|
||||||
|
if(enc->coded_frame && enc->coded_frame->key_frame)
|
||||||
|
pkt.flags |= AV_PKT_FLAG_KEY;
|
||||||
|
if (ost->logfile && enc->stats_out) {
|
||||||
|
fprintf(ost->logfile, "%s", enc->stats_out);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret <= 0)
|
||||||
|
break;
|
||||||
|
pkt.data = bit_buffer;
|
||||||
|
pkt.size = ret;
|
||||||
|
if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
|
||||||
|
pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
|
||||||
|
write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* pkt = NULL means EOF (needed to flush decoder buffers) */
|
/* pkt = NULL means EOF (needed to flush decoder buffers) */
|
||||||
static int output_packet(InputStream *ist, int ist_index,
|
static int output_packet(InputStream *ist, int ist_index,
|
||||||
OutputStream *ost_table, int nb_ostreams,
|
OutputStream *ost_table, int nb_ostreams,
|
||||||
@@ -1793,87 +1867,7 @@ static int output_packet(InputStream *ist, int ist_index,
|
|||||||
discard_packet:
|
discard_packet:
|
||||||
if (pkt == NULL) {
|
if (pkt == NULL) {
|
||||||
/* EOF handling */
|
/* EOF handling */
|
||||||
|
flush_encoders(ist_index, ost_table, nb_ostreams);
|
||||||
for(i=0;i<nb_ostreams;i++) {
|
|
||||||
ost = &ost_table[i];
|
|
||||||
if (ost->source_index == ist_index) {
|
|
||||||
AVCodecContext *enc= ost->st->codec;
|
|
||||||
os = output_files[ost->file_index].ctx;
|
|
||||||
|
|
||||||
if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
|
|
||||||
continue;
|
|
||||||
if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (ost->encoding_needed) {
|
|
||||||
for(;;) {
|
|
||||||
AVPacket pkt;
|
|
||||||
int fifo_bytes;
|
|
||||||
av_init_packet(&pkt);
|
|
||||||
pkt.stream_index= ost->index;
|
|
||||||
|
|
||||||
switch(ost->st->codec->codec_type) {
|
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
|
||||||
fifo_bytes = av_fifo_size(ost->fifo);
|
|
||||||
ret = 0;
|
|
||||||
/* encode any samples remaining in fifo */
|
|
||||||
if (fifo_bytes > 0) {
|
|
||||||
int osize = av_get_bytes_per_sample(enc->sample_fmt);
|
|
||||||
int fs_tmp = enc->frame_size;
|
|
||||||
|
|
||||||
av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
|
|
||||||
if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
|
|
||||||
enc->frame_size = fifo_bytes / (osize * enc->channels);
|
|
||||||
} else { /* pad */
|
|
||||||
int frame_bytes = enc->frame_size*osize*enc->channels;
|
|
||||||
if (allocated_audio_buf_size < frame_bytes)
|
|
||||||
exit_program(1);
|
|
||||||
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);
|
|
||||||
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) {
|
|
||||||
ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Audio encoding failed\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
audio_size += ret;
|
|
||||||
pkt.flags |= AV_PKT_FLAG_KEY;
|
|
||||||
break;
|
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
|
||||||
ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "Video encoding failed\n");
|
|
||||||
exit_program(1);
|
|
||||||
}
|
|
||||||
video_size += ret;
|
|
||||||
if(enc->coded_frame && enc->coded_frame->key_frame)
|
|
||||||
pkt.flags |= AV_PKT_FLAG_KEY;
|
|
||||||
if (ost->logfile && enc->stats_out) {
|
|
||||||
fprintf(ost->logfile, "%s", enc->stats_out);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret=-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ret<=0)
|
|
||||||
break;
|
|
||||||
pkt.data= bit_buffer;
|
|
||||||
pkt.size= ret;
|
|
||||||
if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
|
|
||||||
pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
|
|
||||||
write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1896,6 +1890,37 @@ static void print_sdp(OutputFile *output_files, int n)
|
|||||||
av_freep(&avc);
|
av_freep(&avc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
|
||||||
|
char *error, int error_len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
InputStream *ist = &input_streams[ist_index];
|
||||||
|
if (ist->decoding_needed) {
|
||||||
|
AVCodec *codec = ist->dec;
|
||||||
|
if (!codec)
|
||||||
|
codec = avcodec_find_decoder(ist->st->codec->codec_id);
|
||||||
|
if (!codec) {
|
||||||
|
snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
|
||||||
|
ist->st->codec->codec_id, ist->file_index, ist->st->index);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
|
||||||
|
snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
|
||||||
|
ist->file_index, ist->st->index);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
assert_codec_experimental(ist->st->codec, 0);
|
||||||
|
assert_avoptions(ist->opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
|
||||||
|
ist->next_pts = AV_NOPTS_VALUE;
|
||||||
|
ist->is_start = 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following code is the main loop of the file converter
|
* The following code is the main loop of the file converter
|
||||||
*/
|
*/
|
||||||
@@ -1904,7 +1929,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
InputFile *input_files,
|
InputFile *input_files,
|
||||||
int nb_input_files)
|
int nb_input_files)
|
||||||
{
|
{
|
||||||
int ret = 0, i, j, step;
|
int ret = 0, i, step;
|
||||||
AVFormatContext *is, *os;
|
AVFormatContext *is, *os;
|
||||||
AVCodecContext *codec, *icodec;
|
AVCodecContext *codec, *icodec;
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
@@ -1914,8 +1939,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
int want_sdp = 1;
|
int want_sdp = 1;
|
||||||
uint8_t *no_packet;
|
uint8_t *no_packet;
|
||||||
int no_packet_count=0;
|
int no_packet_count=0;
|
||||||
int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
|
int64_t timer_start;
|
||||||
int nb_streams[AVMEDIA_TYPE_NB]={0};
|
|
||||||
|
|
||||||
if (!(no_packet = av_mallocz(nb_input_files)))
|
if (!(no_packet = av_mallocz(nb_input_files)))
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
@@ -2195,40 +2219,10 @@ static int transcode(OutputFile *output_files,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open each decoder */
|
/* init input streams */
|
||||||
for (i = 0; i < nb_input_streams; i++) {
|
for (i = 0; i < nb_input_streams; i++)
|
||||||
ist = &input_streams[i];
|
if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error)) < 0))
|
||||||
if (ist->decoding_needed) {
|
|
||||||
AVCodec *codec = ist->dec;
|
|
||||||
if (!codec)
|
|
||||||
codec = avcodec_find_decoder(ist->st->codec->codec_id);
|
|
||||||
if (!codec) {
|
|
||||||
snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
|
|
||||||
ist->st->codec->codec_id, ist->file_index, ist->st->index);
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
goto dump_format;
|
goto dump_format;
|
||||||
}
|
|
||||||
|
|
||||||
if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
|
|
||||||
snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
|
|
||||||
ist->file_index, ist->st->index);
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
goto dump_format;
|
|
||||||
}
|
|
||||||
assert_codec_experimental(ist->st->codec, 0);
|
|
||||||
assert_avoptions(ost->opts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init pts */
|
|
||||||
for (i = 0; i < nb_input_streams; i++) {
|
|
||||||
AVStream *st;
|
|
||||||
ist = &input_streams[i];
|
|
||||||
st= ist->st;
|
|
||||||
ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
|
|
||||||
ist->next_pts = AV_NOPTS_VALUE;
|
|
||||||
ist->is_start = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open files and write file headers */
|
/* open files and write file headers */
|
||||||
for (i = 0; i < nb_output_files; i++) {
|
for (i = 0; i < nb_output_files; i++) {
|
||||||
@@ -2469,7 +2463,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
av_free_packet(&pkt);
|
av_free_packet(&pkt);
|
||||||
|
|
||||||
/* dump report by using the output first video and audio streams */
|
/* dump report by using the output first video and audio streams */
|
||||||
print_report(output_files, output_streams, nb_output_streams, 0);
|
print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at the end of stream, we must flush the decoder buffers */
|
/* at the end of stream, we must flush the decoder buffers */
|
||||||
@@ -2489,7 +2483,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* dump report by using the first video and audio streams */
|
/* dump report by using the first video and audio streams */
|
||||||
print_report(output_files, output_streams, nb_output_streams, 1);
|
print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
|
||||||
|
|
||||||
/* close each encoder */
|
/* close each encoder */
|
||||||
for (i = 0; i < nb_output_streams; i++) {
|
for (i = 0; i < nb_output_streams; i++) {
|
||||||
@@ -3292,8 +3286,6 @@ static OutputStream *new_video_stream(AVFormatContext *oc)
|
|||||||
video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
|
video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
|
||||||
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
|
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
|
||||||
|
|
||||||
if (intra_only)
|
|
||||||
video_enc->gop_size = 0;
|
|
||||||
if (video_qscale || same_quant) {
|
if (video_qscale || same_quant) {
|
||||||
video_enc->flags |= CODEC_FLAG_QSCALE;
|
video_enc->flags |= CODEC_FLAG_QSCALE;
|
||||||
video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
|
video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
|
||||||
@@ -3804,6 +3796,8 @@ static int opt_output_file(const char *opt, const char *filename)
|
|||||||
metadata_chapters_autocopy = 1;
|
metadata_chapters_autocopy = 1;
|
||||||
av_freep(&stream_maps);
|
av_freep(&stream_maps);
|
||||||
nb_stream_maps = 0;
|
nb_stream_maps = 0;
|
||||||
|
av_freep(&streamid_map);
|
||||||
|
nb_streamid_map = 0;
|
||||||
|
|
||||||
av_dict_free(&codec_names);
|
av_dict_free(&codec_names);
|
||||||
|
|
||||||
@@ -4218,13 +4212,12 @@ static const OptionDef options[] = {
|
|||||||
{ "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
|
{ "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
|
||||||
{ "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
|
{ "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
|
||||||
{ "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
|
{ "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
|
||||||
{ "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
|
|
||||||
{ "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
|
{ "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
|
||||||
{ "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
|
{ "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
|
||||||
{ "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
|
{ "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
|
||||||
{ "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
|
{ "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
|
||||||
{ "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
|
{ "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
|
||||||
{ "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
|
{ "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
|
||||||
{ "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
|
{ "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
|
||||||
"use same quantizer 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" },
|
{ "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
|
||||||
|
@@ -354,8 +354,6 @@ pixel formats.
|
|||||||
Set SwScaler flags.
|
Set SwScaler flags.
|
||||||
@item -g @var{gop_size}
|
@item -g @var{gop_size}
|
||||||
Set the group of pictures size.
|
Set the group of pictures size.
|
||||||
@item -intra
|
|
||||||
Use only intra frames.
|
|
||||||
@item -vdt @var{n}
|
@item -vdt @var{n}
|
||||||
Discard threshold.
|
Discard threshold.
|
||||||
@item -qscale @var{q}
|
@item -qscale @var{q}
|
||||||
|
@@ -581,6 +581,8 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
|||||||
sr = sample_rate_idx(avctx->sample_rate);
|
sr = sample_rate_idx(avctx->sample_rate);
|
||||||
ac->m4ac.sampling_index = sr;
|
ac->m4ac.sampling_index = sr;
|
||||||
ac->m4ac.channels = avctx->channels;
|
ac->m4ac.channels = avctx->channels;
|
||||||
|
ac->m4ac.sbr = -1;
|
||||||
|
ac->m4ac.ps = -1;
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(ff_mpeg4audio_channels); i++)
|
for (i = 0; i < FF_ARRAY_ELEMS(ff_mpeg4audio_channels); i++)
|
||||||
if (ff_mpeg4audio_channels[i] == avctx->channels)
|
if (ff_mpeg4audio_channels[i] == avctx->channels)
|
||||||
@@ -2092,10 +2094,10 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
|
|||||||
if (ac->output_configured != OC_LOCKED) {
|
if (ac->output_configured != OC_LOCKED) {
|
||||||
ac->m4ac.sbr = -1;
|
ac->m4ac.sbr = -1;
|
||||||
ac->m4ac.ps = -1;
|
ac->m4ac.ps = -1;
|
||||||
}
|
|
||||||
ac->m4ac.sample_rate = hdr_info.sample_rate;
|
ac->m4ac.sample_rate = hdr_info.sample_rate;
|
||||||
ac->m4ac.sampling_index = hdr_info.sampling_index;
|
ac->m4ac.sampling_index = hdr_info.sampling_index;
|
||||||
ac->m4ac.object_type = hdr_info.object_type;
|
ac->m4ac.object_type = hdr_info.object_type;
|
||||||
|
}
|
||||||
if (!ac->avctx->sample_rate)
|
if (!ac->avctx->sample_rate)
|
||||||
ac->avctx->sample_rate = hdr_info.sample_rate;
|
ac->avctx->sample_rate = hdr_info.sample_rate;
|
||||||
if (hdr_info.num_aac_frames == 1) {
|
if (hdr_info.num_aac_frames == 1) {
|
||||||
@@ -2116,7 +2118,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
|||||||
ChannelElement *che = NULL, *che_prev = NULL;
|
ChannelElement *che = NULL, *che_prev = NULL;
|
||||||
enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
|
enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
|
||||||
int err, elem_id, data_size_tmp;
|
int err, elem_id, data_size_tmp;
|
||||||
int samples = 0, multiplier;
|
int samples = 0, multiplier, audio_found = 0;
|
||||||
|
|
||||||
if (show_bits(gb, 12) == 0xfff) {
|
if (show_bits(gb, 12) == 0xfff) {
|
||||||
if (parse_adts_frame_header(ac, gb) < 0) {
|
if (parse_adts_frame_header(ac, gb) < 0) {
|
||||||
@@ -2147,10 +2149,12 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
case TYPE_SCE:
|
case TYPE_SCE:
|
||||||
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
||||||
|
audio_found = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CPE:
|
case TYPE_CPE:
|
||||||
err = decode_cpe(ac, gb, che);
|
err = decode_cpe(ac, gb, che);
|
||||||
|
audio_found = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CCE:
|
case TYPE_CCE:
|
||||||
@@ -2159,6 +2163,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
case TYPE_LFE:
|
case TYPE_LFE:
|
||||||
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
||||||
|
audio_found = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_DSE:
|
case TYPE_DSE:
|
||||||
@@ -2235,7 +2240,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
|||||||
samples, avctx->channels);
|
samples, avctx->channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ac->output_configured)
|
if (ac->output_configured && audio_found)
|
||||||
ac->output_configured = OC_LOCKED;
|
ac->output_configured = OC_LOCKED;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -67,7 +67,7 @@ do_lavf mxf "-ar 48000 -bf 2 -timecode 02:56:14:13"
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$do_mxf_d10" ]; then
|
if [ -n "$do_mxf_d10" ]; then
|
||||||
do_lavf mxf_d10 "-ar 48000 -ac 2 -r 25 -s 720x576 -vf pad=720:608:0:32 -vcodec mpeg2video -intra -flags +ildct+low_delay -dc 10 -flags2 +ivlc+non_linear_q -qscale 1 -ps 1 -qmin 1 -rc_max_vbv_use 1 -rc_min_vbv_use 1 -pix_fmt yuv422p -minrate 30000k -maxrate 30000k -b 30000k -bufsize 1200000 -top 1 -rc_init_occupancy 1200000 -qmax 12 -f mxf_d10"
|
do_lavf mxf_d10 "-ar 48000 -ac 2 -r 25 -s 720x576 -vf pad=720:608:0:32 -vcodec mpeg2video -g 0 -flags +ildct+low_delay -dc 10 -flags2 +ivlc+non_linear_q -qscale 1 -ps 1 -qmin 1 -rc_max_vbv_use 1 -rc_min_vbv_use 1 -pix_fmt yuv422p -minrate 30000k -maxrate 30000k -b 30000k -bufsize 1200000 -top 1 -rc_init_occupancy 1200000 -qmax 12 -f mxf_d10"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$do_ts" ] ; then
|
if [ -n "$do_ts" ] ; then
|
||||||
|
Reference in New Issue
Block a user