flv->initDelay = timestamp;
flv->initDelay = pkt->pts;
static int flv_write_packet(AVFormatContext *s, int stream_index,                            const uint8_t *buf, int size, int64_t timestamp){    ByteIOContext *pb = &s->pb;    AVCodecContext *enc = &s->streams[stream_index]->codec;    FLVContext *flv = s->priv_data;    FLVFrame *frame = av_malloc(sizeof(FLVFrame));    frame->next = 0;    frame->size = size;    frame->data = av_malloc(size);    frame->timestamp = timestamp;    frame->reserved= flv->reserved;    memcpy(frame->data,buf,size);    //    av_log(s, AV_LOG_DEBUG, "type:%d pts: %lld size:%d\n", enc->codec_type, timestamp, size);        if (enc->codec_type == CODEC_TYPE_VIDEO) {        frame->type = 9;        frame->flags = 2; // choose h263        frame->flags |= enc->coded_frame->key_frame ? 0x10 : 0x20; // add keyframe indicator        //frame->timestamp = ( ( flv->frameCount * (int64_t)FRAME_RATE_BASE * (int64_t)1000 ) / (int64_t)enc->frame_rate );        //printf("%08x %f %f\n",frame->timestamp,(double)enc->frame_rate/(double)FRAME_RATE_BASE,1000*(double)FRAME_RATE_BASE/(double)enc->frame_rate);        flv->hasVideo = 1;        InsertSorted(flv,frame);        flv->frameCount ++;    }    else if (enc->codec_type == CODEC_TYPE_AUDIO) {        int soundFormat = 0x02;        switch (enc->sample_rate) {            case    44100:                soundFormat |= 0x0C;                break;            case    22050:                soundFormat |= 0x08;                break;            case    11025:                soundFormat |= 0x04;                break;            case     8000: //nellymoser only            case     5512: //not mp3                soundFormat |= 0x00;                break;            default:                assert(0);        }        if (enc->channels > 1) {            soundFormat |= 0x01;        }                switch(enc->codec_id){        case CODEC_ID_MP3:            soundFormat |= 0x20;            break;        case 0:            soundFormat |= enc->codec_tag<<4;            break;        default:            assert(0);        }        assert(size);        if ( flv->initDelay == -1 ) {            flv->initDelay = timestamp;        }        frame->type = 8;        frame->flags = soundFormat;//            if ( flv->audioTime == -1 ) {//                flv->audioTime = ( ( ( flv->sampleCount - enc->delay ) * 8000 ) / flv->audioRate ) - flv->initDelay - 250;//                if ( flv->audioTime < 0 ) {//                    flv->audioTime = 0;//                }//            }#ifdef CONFIG_MP3LAME        if (enc->codec_id == CODEC_ID_MP3 ) {            int mp3FrameSize = 0;            int mp3SampleRate = 0;            int mp3IsMono = 0;            int mp3SamplesPerFrame = 0;            /* copy out mp3 header from ring buffer */            if(!mp3info(buf,&mp3FrameSize,&mp3SamplesPerFrame,&mp3SampleRate,&mp3IsMono))                assert(0);            assert ( size == mp3FrameSize );            assert(enc->sample_rate == mp3SampleRate);//            assert(enc->frame_size == mp3SamplesPerFrame);//av_log(NULL, AV_LOG_DEBUG, "sizes: %d %d\n", enc->frame_size, mp3SamplesPerFrame);            frame->timestamp = (1000*flv->sampleCount + enc->sample_rate/2)/(enc->sample_rate);            flv->sampleCount += mp3SamplesPerFrame;        }#endif        // We got audio! Make sure we set this to the global flags on closure        flv->hasAudio = 1;        InsertSorted(flv,frame);    }else        assert(0);    Dump(flv,pb,128);    put_flush_packet(pb);    return 0;}