* 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>tags/n0.9
@@ -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; | |||
@@ -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. | |||
*/ | |||