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 <sven...@gmx.de> 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 <sven...@gmx.de> 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 <sven...@gmx.de> 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 <m.quan...@gmail.com> 
>>>>>> 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 <sven...@gmx.de>
>>>>>>>
>>>>>>>> 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
>>>>>>>> libav-user@mplayerhq.hu
>>>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> libav-user mailing list
>>>>>>> libav-user@mplayerhq.hu
>>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Gautam Muralidhar
>>>>>> Code Particle Inc.
>>>>>> (805)-501-0700
>>>>>> _______________________________________________
>>>>>> libav-user mailing list
>>>>>> libav-user@mplayerhq.hu
>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>
>>>>> _______________________________________________
>>>>> libav-user mailing list
>>>>> libav-user@mplayerhq.hu
>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Gautam Muralidhar
>>>> Code Particle Inc.
>>>> (805)-501-0700
>>>> _______________________________________________
>>>> libav-user mailing list
>>>> libav-user@mplayerhq.hu
>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>
>>> _______________________________________________
>>> libav-user mailing list
>>> libav-user@mplayerhq.hu
>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>>>
>>
>>
>>
>> --
>> Gautam Muralidhar
>> Code Particle Inc.
>> (805)-501-0700
>> _______________________________________________
>> libav-user mailing list
>> libav-user@mplayerhq.hu
>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>
> _______________________________________________
> libav-user mailing list
> libav-user@mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>



-- 
Gautam Muralidhar
Code Particle Inc.
(805)-501-0700
_______________________________________________
libav-user mailing list
libav-user@mplayerhq.hu
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to