mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-28 20:14:02 +08:00
avconv: Handle audio sync for non-S16 sample formats.
Also fix reporting of the number of samples added/dropped.
This commit is contained in:
31
avconv.c
31
avconv.c
@ -729,6 +729,14 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
static void do_audio_out(AVFormatContext *s,
|
static void do_audio_out(AVFormatContext *s,
|
||||||
OutputStream *ost,
|
OutputStream *ost,
|
||||||
InputStream *ist,
|
InputStream *ist,
|
||||||
@ -829,9 +837,9 @@ need_realloc:
|
|||||||
|
|
||||||
if(audio_sync_method){
|
if(audio_sync_method){
|
||||||
double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
|
double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
|
||||||
- av_fifo_size(ost->fifo)/(enc->channels * 2);
|
- av_fifo_size(ost->fifo)/(enc->channels * osize);
|
||||||
double idelta= delta*dec->sample_rate / enc->sample_rate;
|
int idelta = delta * dec->sample_rate / enc->sample_rate;
|
||||||
int byte_delta= ((int)idelta)*2*dec->channels;
|
int byte_delta = idelta * isize * dec->channels;
|
||||||
|
|
||||||
//FIXME resample delay
|
//FIXME resample delay
|
||||||
if(fabs(delta) > 50){
|
if(fabs(delta) > 50){
|
||||||
@ -840,7 +848,8 @@ need_realloc:
|
|||||||
byte_delta= FFMAX(byte_delta, -size);
|
byte_delta= FFMAX(byte_delta, -size);
|
||||||
size += byte_delta;
|
size += byte_delta;
|
||||||
buf -= byte_delta;
|
buf -= byte_delta;
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
|
av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
|
||||||
|
-byte_delta / (isize * dec->channels));
|
||||||
if(!size)
|
if(!size)
|
||||||
return;
|
return;
|
||||||
ist->is_start=0;
|
ist->is_start=0;
|
||||||
@ -854,11 +863,11 @@ need_realloc:
|
|||||||
}
|
}
|
||||||
ist->is_start=0;
|
ist->is_start=0;
|
||||||
|
|
||||||
memset(input_tmp, 0, byte_delta);
|
generate_silence(input_tmp, dec->sample_fmt, byte_delta);
|
||||||
memcpy(input_tmp + byte_delta, buf, size);
|
memcpy(input_tmp + byte_delta, buf, size);
|
||||||
buf= input_tmp;
|
buf= input_tmp;
|
||||||
size += byte_delta;
|
size += byte_delta;
|
||||||
av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
|
av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
|
||||||
}
|
}
|
||||||
}else if(audio_sync_method>1){
|
}else if(audio_sync_method>1){
|
||||||
int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
|
int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
|
||||||
@ -871,7 +880,7 @@ need_realloc:
|
|||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
|
ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
|
||||||
- av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
|
- av_fifo_size(ost->fifo)/(enc->channels * osize); //FIXME wrong
|
||||||
|
|
||||||
if (ost->audio_resample) {
|
if (ost->audio_resample) {
|
||||||
buftmp = audio_buf;
|
buftmp = audio_buf;
|
||||||
@ -1436,14 +1445,6 @@ static void print_report(OutputFile *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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
|
static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
Reference in New Issue
Block a user