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
