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
