Sven, Thanks for your rapid response, This makes sense. I am going to be trying out a few things with encoding pictures into h264 format. So in my case I dont cut frames at all. So I assume that the calculation of my pts and dts would be something like frameNR*40*90 like in your case? Thanks Gautam
On Tue, Feb 1, 2011 at 11:53 AM, Sven Alisch <[email protected]> wrote: > 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 > -- Gautam Muralidhar Code Particle Inc. (805)-501-0700 _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
