Merge remote-tracking branch 'qatar/master'
* qatar/master: indeo3: check per-plane data buffer against input buffer bounds. avconv: Handle audio sync for non-S16 sample formats. pthread: don't increment index on zero-sized packets. Conflicts: libavcodec/indeo3.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
c40a35f8a7
31
avconv.c
31
avconv.c
@ -779,6 +779,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,
|
||||
OutputStream *ost,
|
||||
InputStream *ist,
|
||||
@ -879,9 +887,9 @@ need_realloc:
|
||||
|
||||
if(audio_sync_method){
|
||||
double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
|
||||
- av_fifo_size(ost->fifo)/(enc->channels * 2);
|
||||
double idelta= delta*dec->sample_rate / enc->sample_rate;
|
||||
int byte_delta= ((int)idelta)*2*dec->channels;
|
||||
- av_fifo_size(ost->fifo)/(enc->channels * osize);
|
||||
int idelta = delta * dec->sample_rate / enc->sample_rate;
|
||||
int byte_delta = idelta * isize * dec->channels;
|
||||
|
||||
//FIXME resample delay
|
||||
if(fabs(delta) > 50){
|
||||
@ -890,7 +898,8 @@ need_realloc:
|
||||
byte_delta= FFMAX(byte_delta, -size);
|
||||
size += 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)
|
||||
return;
|
||||
ist->is_start=0;
|
||||
@ -904,11 +913,11 @@ need_realloc:
|
||||
}
|
||||
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);
|
||||
buf= input_tmp;
|
||||
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){
|
||||
int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
|
||||
@ -921,7 +930,7 @@ need_realloc:
|
||||
}
|
||||
}else
|
||||
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) {
|
||||
buftmp = audio_buf;
|
||||
@ -1505,14 +1514,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)
|
||||
{
|
||||
int i, ret;
|
||||
|
31
ffmpeg.c
31
ffmpeg.c
@ -827,6 +827,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,
|
||||
OutputStream *ost,
|
||||
InputStream *ist,
|
||||
@ -926,9 +934,9 @@ need_realloc:
|
||||
|
||||
if(audio_sync_method){
|
||||
double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
|
||||
- av_fifo_size(ost->fifo)/(enc->channels * 2);
|
||||
double idelta= delta*dec->sample_rate / enc->sample_rate;
|
||||
int byte_delta= ((int)idelta)*2*dec->channels;
|
||||
- av_fifo_size(ost->fifo)/(enc->channels * osize);
|
||||
int idelta = delta * dec->sample_rate / enc->sample_rate;
|
||||
int byte_delta = idelta * isize * dec->channels;
|
||||
|
||||
//FIXME resample delay
|
||||
if(fabs(delta) > 50){
|
||||
@ -937,7 +945,8 @@ need_realloc:
|
||||
byte_delta= FFMAX(byte_delta, -size);
|
||||
size += 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)
|
||||
return;
|
||||
ist->is_start=0;
|
||||
@ -950,11 +959,11 @@ need_realloc:
|
||||
}
|
||||
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);
|
||||
buf= input_tmp;
|
||||
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){
|
||||
int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
|
||||
@ -967,7 +976,7 @@ need_realloc:
|
||||
}
|
||||
}else
|
||||
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) {
|
||||
buftmp = audio_buf;
|
||||
@ -1535,14 +1544,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)
|
||||
{
|
||||
int i, ret;
|
||||
|
@ -494,6 +494,7 @@ static int submit_packet(PerThreadContext *p, AVPacket *avpkt)
|
||||
}
|
||||
|
||||
fctx->prev_thread = p;
|
||||
fctx->next_decoding++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -516,8 +517,6 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
|
||||
err = submit_packet(p, avpkt);
|
||||
if (err) return err;
|
||||
|
||||
fctx->next_decoding++;
|
||||
|
||||
/*
|
||||
* If we're still receiving the initial packets, don't return a frame.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user