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

Reply via email to