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
