Sven,
Thanks for your code,
What are your magic numbers in your math? 40*90 and 120*90?
Also where do you get decodeToFrame value?


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

Reply via email to