On Wed, 24 Apr 2013 18:50:36 +0200, Luca Barbato <[email protected]> wrote:
> 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.
> 

There should be no such problems, there is a sleep in the reading loop if there
was an eagain on all inputs.
But it should behave better if there are multiple inputs.
And of course i tested it and it appears to work fine.

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

Reply via email to