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

Reply via email to