Gautam,

> my case I dont cut frames at all. So I assume that the calculation of
> my pts and dts would be something like frameNR*40*90 like in your
> case?

For the dts you have got right. The pts you don't need to calculate because you 
get the pts as a present by avcodec_encode_video-function.

regards,
Sven

> Thanks
> Gautam
> 
> On Tue, Feb 1, 2011 at 11:53 AM, Sven Alisch <[email protected]> wrote:
>> Gautam,
>> 
>>> What are your magic numbers in your math? 40*90 and 120*90?
>> 
>> Sorry for the hard coded magic numbers. My code is quick and dirty. I have 
>> to do a finetuning now.
>> 
>> 40*90 means 40 ms (because in germany the duration of a frame is 40 ms) and 
>> 90 because of the 90kHz by the standard for PTS-values.
>> 
>>> Also where do you get decodeToFrame value?
>> 
>> Oh this is my own variable. The background is following. My program should 
>> cut not only at keyframes. If I cut not at a keyframe, then I reencode my 
>> "open" GOP. So decodeToFrame tells me, how many frames to decode till the 
>> position where I have to reencode my stream.
>> 
>> Example:
>> 
>> My GOP structure
>> 
>> IBPBPBPPP...
>> 
>> Lets assume I want to cut my videofile at the 3'rd position. Now 
>> decodeToFrame is 3. But I have to decode the whole GOP including the first 
>> key frame. At the 3'rd frame I reencode and create a new coded shorter 
>> sequence. My english is bad, but did you understand?
>> 
>> regards,
>> Sven
>> 
>>> 
>>> 
>>> On Tue, Feb 1, 2011 at 11:34 AM, Sven Alisch <[email protected]> wrote:
>>>> Dear Gautam, dear Max,
>>>> 
>>>> Thank you for your proposals. Now it works. The main problem (I think) 
>>>> depends on the avframe. This avframe was the direct output from the 
>>>> decoder. So this avframe contains many informations that disturbs the 
>>>> encoder. I show the solution (quick and dirty code! No memory cleanup and 
>>>> so on... ) at the end of my mail.
>>>> 
>>>> @Max
>>>> 
>>>> You've got right. It is better to comment the last one out.
>>>> 
>>>> @Gautam
>>>> 
>>>> Yes of course. No problem. Here is my code.
>>>> 
>>>> if (frameFinished)                                                         
>>>>                                                                            
>>>>                   // Here the decoder is finished and decode a frame from 
>>>> an existent h.264 stream
>>>> {
>>>>        frameNr++;
>>>> 
>>>>        if (frameNr >= decodeToFrame)
>>>>        {
>>>>                AVCodecContext* c = t->streamContext->codec;
>>>> 
>>>>                AVFrame* newFrame = avcodec_alloc_frame();                  
>>>>                                                                     // 
>>>> Initialize a new frame
>>>>                int size = avpicture_get_size(c->pix_fmt, c->width, 
>>>> c->height);
>>>>                uint8_t* picture_buf = av_malloc(size);
>>>>                avpicture_fill((AVPicture *)newFrame, picture_buf, 
>>>> c->pix_fmt, c->width, c->height);
>>>>                av_picture_copy((AVPicture*)newFrame, (AVPicture*)avframe, 
>>>> c->pix_fmt, c->width, c->height);    // Copy only the frame content 
>>>> without any other disturbing stuff
>>>> 
>>>>                newFrame->pts = (frameNr - decodeToFrame)*40*90;            
>>>>                                                                     // 
>>>> Setting correct pts
>>>> 
>>>>                int out_size = avcodec_encode_video(c, video_outbuf, 
>>>> video_outbuf_size, newFrame);
>>>>                if (out_size > 0)
>>>>                {
>>>>                        av_init_packet(&tmp_packet);
>>>> 
>>>>                        if (c->coded_frame->pts != AV_NOPTS_VALUE)
>>>>                        {
>>>>                                tmp_packet.pts = 
>>>> av_rescale_q(c->coded_frame->pts,
>>>>                                                                            
>>>>       c->time_base,
>>>>                                                                            
>>>>       c->time_base) + 120*90;
>>>>                                tmp_packet.dts = encodedFrames*40*90;
>>>>                        }
>>>>                        if(c->coded_frame->key_frame)
>>>>                                tmp_packet.flags |= AV_PKT_FLAG_KEY;
>>>>                        tmp_packet.stream_index= t->streamContext->index;
>>>>                        tmp_packet.data= video_outbuf;
>>>>                        tmp_packet.size= out_size;
>>>>                        av_interleaved_write_frame(formatContext, 
>>>> &tmp_packet);
>>>>                        encodedFrames++;
>>>>                }
>>>>        }
>>>> }
>>>> 
>>>> regards,
>>>> Sven
>>>> 
>>>> Am 01.02.2011 um 18:36 schrieb Gautam Muralidhar:
>>>> 
>>>>> Sven,
>>>>> I am seeing similar issues. How exactly are you writing your frames?
>>>>> Do you think you can share your code inside the
>>>>> if(outsize >0)
>>>>> {
>>>>> 
>>>>> }
>>>>> 
>>>>> Thanks
>>>>> Gautam
>>>>> On Tue, Feb 1, 2011 at 6:15 AM, Max The Quantum <[email protected]> 
>>>>> wrote:
>>>>>> I've tried your config, but uncommented all lines except
>>>>>> //c->flags2|=CODEC_FLAG2_8X8DCT;
>>>>>> //c->flags2^=CODEC_FLAG2_8X8DCT;                // flags2=-dct8x8
>>>>>> and commented out
>>>>>>  c->crf = 22;
>>>>>> 
>>>>>> It seems that problem is caused by wrong value of c->keyint_min. What is
>>>>>> default value for it?
>>>>>> Try to set it manually to, say, 25 :)
>>>>>> 
>>>>>> 2011/2/1 Sven Alisch <[email protected]>
>>>>>> 
>>>>>>> Hello list,
>>>>>>> 
>>>>>>> I want to (re-) encode some pictures I decoded with libav. The following
>>>>>>> code shows how I do that:
>>>>>>> 
>>>>>>> First I decode an h.264 Stream and get pictures in an AVFrame structure.
>>>>>>> After doing this I want to encode them into an h.264 stream.
>>>>>>> <snip>
>>>>>>> bytesDecoded =
>>>>>>> avcodec_decode_video2(m->videofile->VideoTrack->codec_context, avframe,
>>>>>>> &frameFinished, &packet);
>>>>>>> 
>>>>>>> if (frameFinished)
>>>>>>> {
>>>>>>>        frameNr++;
>>>>>>> 
>>>>>>>        if (frameNr >= decodeToFrame)
>>>>>>>        {
>>>>>>>                AVCodecContext* c = t->streamContext->codec;
>>>>>>>                avframe->pts = (frameNr - decodeToFrame)*40*90;
>>>>>>>                int out_size = avcodec_encode_video(c, video_outbuf,
>>>>>>> video_outbuf_size, avframe);
>>>>>>>                if (out_size > 0)
>>>>>>>                {
>>>>>>>                        ...
>>>>>>>                }
>>>>>>> <snap>
>>>>>>> 
>>>>>>> My Encoding parameters for x264 are set in a function like this:
>>>>>>> 
>>>>>>> bool h264_initEncoder(AVFormatContext* fc, tavtrack_t* track)
>>>>>>> {
>>>>>>>        AVCodec* codec = NULL;
>>>>>>>        AVCodecContext* c = NULL;
>>>>>>> 
>>>>>>>        c = track->streamContext->codec;
>>>>>>>        c->profile = track->codec_context->profile;     // original set 
>>>>>>> by
>>>>>>> libavformat/libavcodec
>>>>>>>        c->level = track->codec_context->level;         // original set 
>>>>>>> by
>>>>>>> libavformat/libavcodec
>>>>>>> 
>>>>>>>        // Medium Profile
>>>>>>>        // libx264-medium.ffpreset preset
>>>>>>>        c->coder_type = FF_CODER_TYPE_AC;       // coder = 1
>>>>>>>        c->flags |= CODEC_FLAG_LOOP_FILTER; // flags=+loop
>>>>>>>        c->me_cmp|= 1;                                          //
>>>>>>> cmp=+chroma, where CHROMA = 1
>>>>>>>        c->partitions |=
>>>>>>> X264_PART_I8X8+X264_PART_I4X4+X264_PART_P8X8+X264_PART_B8X8;
>>>>>>> 
>>>>>>>    // partitions=+parti8x8+parti4x4+partp8x8+partb8x8
>>>>>>>        c->me_method=ME_HEX;                            // me_method=hex
>>>>>>>        c->me_subpel_quality = 7;                       // subq=7
>>>>>>>        c->me_range = 16;                                       //
>>>>>>> me_range=16
>>>>>>>        //c->gop_size = 250;                                    // g=250
>>>>>>>        //c->keyint_min = 25;                                   //
>>>>>>> keyint_min=25
>>>>>>>        c->scenechange_threshold = 40;          // sc_threshold=40
>>>>>>>        //c->i_quant_factor = 0.71;                     // i_qfactor=0.71
>>>>>>>        //c->b_frame_strategy = 1;                      // b_strategy=1
>>>>>>>        c->qcompress = 0.6;                                     // 
>>>>>>> qcomp=0.6
>>>>>>>        c->qmin = 10;                                           // 
>>>>>>> qmin=10
>>>>>>>        c->qmax = 51;                                           // 
>>>>>>> qmax=51
>>>>>>>        c->max_qdiff = 4;                                       // 
>>>>>>> qdiff=4
>>>>>>>        c->max_b_frames = 3;                            // bf=3
>>>>>>>        c->refs = 3;                                            // refs=3
>>>>>>>        //c->directpred = 1;                                    //
>>>>>>> directpred=1
>>>>>>>        //c->trellis = 1;                                               
>>>>>>> //
>>>>>>> trellis=1
>>>>>>>        c->flags2 |=
>>>>>>> CODEC_FLAG2_BPYRAMID+CODEC_FLAG2_MIXED_REFS+CODEC_FLAG2_WPRED+CODEC_FLAG2_8X8DCT+CODEC_FLAG2_FASTPSKIP;
>>>>>>> 
>>>>>>>    // flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip
>>>>>>>        c->weighted_p_pred = 2;                         // wpredp=2
>>>>>>> 
>>>>>>>        // libx264-main.ffpreset preset
>>>>>>>        //c->flags2|=CODEC_FLAG2_8X8DCT;
>>>>>>>        //c->flags2^=CODEC_FLAG2_8X8DCT;                // flags2=-dct8x8
>>>>>>>        c->crf = 22;
>>>>>>>        codec = avcodec_find_encoder(c->codec_id);
>>>>>>>        if (!codec)
>>>>>>>                return false;
>>>>>>> 
>>>>>>>        if (avcodec_open(c, codec) < 0)
>>>>>>>                return false;
>>>>>>> 
>>>>>>>        return true;
>>>>>>> }
>>>>>>> 
>>>>>>> The Problem is, that the avcode_encode_video( ... ) works but no frame 
>>>>>>> will
>>>>>>> be compressed. I get strange errors like this:
>>>>>>> 
>>>>>>> [libx264 @ 0x101003600] specified frame type (5) at 0 is not compatible
>>>>>>> with keyframe interval
>>>>>>> [libx264 @ 0x101003600] specified frame type (5) at 1 is not compatible
>>>>>>> with keyframe interval
>>>>>>> [libx264 @ 0x101003600] specified frame type (3) at 2 is not compatible
>>>>>>> with keyframe interval
>>>>>>> 
>>>>>>> I get no frame. But why? Does anybody has an hint for me? Are my 
>>>>>>> parameters
>>>>>>> wrong?
>>>>>>> 
>>>>>>> regards,
>>>>>>> Sven
>>>>>>> _______________________________________________
>>>>>>> libav-user mailing list
>>>>>>> [email protected]
>>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>>> 
>>>>>> _______________________________________________
>>>>>> libav-user mailing list
>>>>>> [email protected]
>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> Gautam Muralidhar
>>>>> Code Particle Inc.
>>>>> (805)-501-0700
>>>>> _______________________________________________
>>>>> libav-user mailing list
>>>>> [email protected]
>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>> 
>>>> _______________________________________________
>>>> libav-user mailing list
>>>> [email protected]
>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> Gautam Muralidhar
>>> Code Particle Inc.
>>> (805)-501-0700
>>> _______________________________________________
>>> libav-user mailing list
>>> [email protected]
>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>> 
>> _______________________________________________
>> libav-user mailing list
>> [email protected]
>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>> 
> 
> 
> 
> -- 
> Gautam Muralidhar
> Code Particle Inc.
> (805)-501-0700
> _______________________________________________
> libav-user mailing list
> [email protected]
> https://lists.mplayerhq.hu/mailman/listinfo/libav-user

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to