* 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. | |||
| */ | |||