On 04/24/2013 05:29 PM, Anton Khirnov wrote:
> Integrate the code in the packet reading function, instead of inserting
> sleeps in many places.
> This is simpler to follow and should work better.
> ---
>  avconv.c |   28 +++++++++++-----------------
>  1 file changed, 11 insertions(+), 17 deletions(-)
> 
> diff --git a/avconv.c b/avconv.c
> index 658dadc..7aee0cb 100644
> --- a/avconv.c
> +++ b/avconv.c
> @@ -1046,16 +1046,6 @@ static void do_streamcopy(InputStream *ist, 
> OutputStream *ost, const AVPacket *p
>      ost->st->codec->frame_number++;
>  }
>  
> -static void rate_emu_sleep(InputStream *ist)
> -{
> -    if (input_files[ist->file_index]->rate_emu) {
> -        int64_t pts = av_rescale(ist->last_dts, 1000000, AV_TIME_BASE);
> -        int64_t now = av_gettime() - ist->start;
> -        if (pts > now)
> -            av_usleep(pts - now);
> -    }
> -}
> -
>  int guess_input_channel_layout(InputStream *ist)
>  {
>      AVCodecContext *dec = ist->st->codec;
> @@ -1104,8 +1094,6 @@ static int decode_audio(InputStream *ist, AVPacket 
> *pkt, int *got_output)
>          pkt->pts           = AV_NOPTS_VALUE;
>      }
>  
> -    rate_emu_sleep(ist);
> -
>      resample_changed = ist->resample_sample_fmt     != decoded_frame->format 
>         ||
>                         ist->resample_channels       != avctx->channels       
>         ||
>                         ist->resample_channel_layout != 
> decoded_frame->channel_layout ||
> @@ -1199,8 +1187,6 @@ static int decode_video(InputStream *ist, AVPacket 
> *pkt, int *got_output)
>      pre_process_video_frame(ist, (AVPicture *)decoded_frame, 
> &buffer_to_free);
>  #endif
>  
> -    rate_emu_sleep(ist);
> -
>      if (ist->st->sample_aspect_ratio.num)
>          decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
>  
> @@ -1260,8 +1246,6 @@ static int transcode_subtitles(InputStream *ist, 
> AVPacket *pkt, int *got_output)
>      if (!*got_output)
>          return ret;
>  
> -    rate_emu_sleep(ist);
> -
>      for (i = 0; i < nb_output_streams; i++) {
>          OutputStream *ost = output_streams[i];
>  
> @@ -1349,7 +1333,6 @@ static int output_packet(InputStream *ist, const 
> AVPacket *pkt)
>  
>      /* handle stream copy */
>      if (!ist->decoding_needed) {
> -        rate_emu_sleep(ist);
>          ist->last_dts = ist->next_dts;
>          switch (ist->st->codec->codec_type) {
>          case AVMEDIA_TYPE_AUDIO:
> @@ -2056,6 +2039,17 @@ static int get_input_packet_mt(InputFile *f, AVPacket 
> *pkt)
>  
>  static int get_input_packet(InputFile *f, AVPacket *pkt)
>  {
> +    if (f->rate_emu) {
> +        int i;
> +        for (i = 0; i < f->nb_streams; i++) {
> +            InputStream *ist = input_streams[f->ist_index + i];
> +            int64_t pts = av_rescale(ist->last_dts, 1000000, AV_TIME_BASE);
> +            int64_t now = av_gettime() - ist->start;
> +            if (pts > now)
> +                return AVERROR(EAGAIN);
> +        }
> +    }

Should be tested, surely it would be more precise but it is busy wait vs
sleep so might cause unwanted effects. might be better get the timing
for all the streams and wait for the least amount before returning eagain.

lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to