Gautam,, your code looks ok, also for h.264. My code does not really differ.
> doesn't seem to add up. Do you mean, you are missing some pictures? Than yes, please tell me. I had the same problem and I working currently at a function to solve this. By the way, please post me your encoding options for h.264. Maybe you missed an encoding option. Does ffmpeg post any error warnings while your encoding process? If not the please add the line av_log_set_level(AV_LOG_VERBOSE); So we can see if there is an another problem. regards, Sven > Thanks > Gautam > > On Tue, Feb 1, 2011 at 12:11 PM, Sven Alisch <[email protected]> wrote: >> Dear Gautam, >> >> This really no problem, because I was a bloody beginner and the people here >> helped me very much. If you need code, don't hestitate to post it and ask. >> >> regards, >> Sven >> >> Am 01.02.2011 um 21:04 schrieb Gautam Muralidhar: >> >>> Sven, >>> This is great, thanks again. Please excuse me for beginner questions. >>> I may have to bother you in the near future with more info :) >>> Thanks in advance >>> Gautam >>> >>> On Tue, Feb 1, 2011 at 12:03 PM, Sven Alisch <[email protected]> wrote: >>>> Gautam, >>>> >>>>> 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? >>>> >>>> For the dts you have got right. The pts you don't need to calculate >>>> because you get the pts as a present by avcodec_encode_video-function. >>>> >>>> regards, >>>> Sven >>>> >>>>> 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 >>>> >>>> _______________________________________________ >>>> 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
