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

Reply via email to