double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
static void do_audio_out(AVFormatContext *s,                          AVOutputStream *ost,                          AVInputStream *ist,                         unsigned char *buf, int size){    uint8_t *buftmp;    static uint8_t *audio_buf = NULL;    static uint8_t *audio_out = NULL;    const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;    int size_out, frame_bytes, ret;    AVCodecContext *enc= &ost->st->codec;    /* SC: dynamic allocation of buffers */    if (!audio_buf)        audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);    if (!audio_out)        audio_out = av_malloc(audio_out_size);    if (!audio_buf || !audio_out)        return;               /* Should signal an error ! */    if(audio_sync_method){        double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts                 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);        double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;        int byte_delta= ((int)idelta)*2*ist->st->codec.channels;        //FIXME resample delay        if(fabs(delta) > 50){            if(ist->is_start){                if(byte_delta < 0){                    byte_delta= FFMAX(byte_delta, -size);                    size += byte_delta;                    buf  -= byte_delta;                    if(verbose > 2)                        fprintf(stderr, "discarding %d audio samples\n", (int)-delta);                    if(!size)                        return;                    ist->is_start=0;                }else{                    static uint8_t *input_tmp= NULL;                    input_tmp= av_realloc(input_tmp, byte_delta + size);                    if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)                        ist->is_start=0;                    else                        byte_delta= MAX_AUDIO_PACKET_SIZE - size;                    memset(input_tmp, 0, byte_delta);                    memcpy(input_tmp + byte_delta, buf, size);                    buf= input_tmp;                    size += byte_delta;                    if(verbose > 2)                        fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);                }            }else if(audio_sync_method>1){                int comp= clip(delta, -audio_sync_method, audio_sync_method);                assert(ost->audio_resample);                if(verbose > 2)                    fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);//                fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(ost->sync_ipts * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));                av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);            }        }     }else        ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)                        - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong    if (ost->audio_resample) {        buftmp = audio_buf;        size_out = audio_resample(ost->resample,                                   (short *)buftmp, (short *)buf,                                  size / (ist->st->codec.channels * 2));        size_out = size_out * enc->channels * 2;    } else {        buftmp = buf;        size_out = size;    }    /* now encode as many frames as possible */    if (enc->frame_size > 1) {        /* output resampled raw samples */        fifo_write(&ost->fifo, buftmp, size_out,                    &ost->fifo.wptr);        frame_bytes = enc->frame_size * 2 * enc->channels;                while (fifo_read(&ost->fifo, audio_buf, frame_bytes,                      &ost->fifo.rptr) == 0) {            AVPacket pkt;            av_init_packet(&pkt);            ret = avcodec_encode_audio(enc, audio_out, audio_out_size,                                        (short *)audio_buf);            audio_size += ret;            pkt.stream_index= ost->index;            pkt.data= audio_out;            pkt.size= ret;            if(enc->coded_frame)                pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);            pkt.flags |= PKT_FLAG_KEY;            av_interleaved_write_frame(s, &pkt);                        ost->sync_opts += enc->frame_size;        }    } else {        AVPacket pkt;        av_init_packet(&pkt);        ost->sync_opts += size_out / (2 * enc->channels);        /* output a pcm frame */        /* XXX: change encoding codec API to avoid this ? */        switch(enc->codec->id) {        case CODEC_ID_PCM_S16LE:        case CODEC_ID_PCM_S16BE:        case CODEC_ID_PCM_U16LE:        case CODEC_ID_PCM_U16BE:            break;        default:            size_out = size_out >> 1;            break;        }        ret = avcodec_encode_audio(enc, audio_out, size_out, 				   (short *)buftmp);        audio_size += ret;        pkt.stream_index= ost->index;        pkt.data= audio_out;        pkt.size= ret;        if(enc->coded_frame)            pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);        pkt.flags |= PKT_FLAG_KEY;        av_interleaved_write_frame(s, &pkt);    }}