Sven,
This is how I am writing my frame.
Do you see anything wrong with this method?
It works fine for non-h264 videos but for h264 videos something
doesn't seem to add up.
Thanks
Gautam

On Tue, Feb 1, 2011 at 12:11 PM, Sven Alisch <[email protected]> wrote:
> Dear Gautam,
>
> This really no problem, because I was a bloody beginner and the people here 
> helped me very much.  If you need code, don't hestitate to post it and ask.
>
> regards,
> Sven
>
> Am 01.02.2011 um 21:04 schrieb Gautam Muralidhar:
>
>> Sven,
>> This is great, thanks again. Please excuse me for beginner questions.
>> I may have to bother you in the near future with more info :)
>> Thanks in advance
>> Gautam
>>
>> On Tue, Feb 1, 2011 at 12:03 PM, Sven Alisch <[email protected]> wrote:
>>> 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
>>>
>>
>>
>>
>> --
>> 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

Reply via email to