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 <sven...@gmx.de> 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 <sven...@gmx.de> 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 <sven...@gmx.de> 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 <m.quan...@gmail.com> >>>>>> 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 <sven...@gmx.de> >>>>>>> >>>>>>>> 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 >>>>>>>> libav-user@mplayerhq.hu >>>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>>>>>> >>>>>>> _______________________________________________ >>>>>>> libav-user mailing list >>>>>>> libav-user@mplayerhq.hu >>>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Gautam Muralidhar >>>>>> Code Particle Inc. >>>>>> (805)-501-0700 >>>>>> _______________________________________________ >>>>>> libav-user mailing list >>>>>> libav-user@mplayerhq.hu >>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>>> >>>>> _______________________________________________ >>>>> libav-user mailing list >>>>> libav-user@mplayerhq.hu >>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>>> >>>> >>>> >>>> >>>> -- >>>> Gautam Muralidhar >>>> Code Particle Inc. >>>> (805)-501-0700 >>>> _______________________________________________ >>>> libav-user mailing list >>>> libav-user@mplayerhq.hu >>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>> >>> _______________________________________________ >>> libav-user mailing list >>> libav-user@mplayerhq.hu >>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>> >> >> >> >> -- >> Gautam Muralidhar >> Code Particle Inc. >> (805)-501-0700 >> _______________________________________________ >> libav-user mailing list >> libav-user@mplayerhq.hu >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user > > _______________________________________________ > libav-user mailing list > libav-user@mplayerhq.hu > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > -- Gautam Muralidhar Code Particle Inc. (805)-501-0700 _______________________________________________ libav-user mailing list libav-user@mplayerhq.hu https://lists.mplayerhq.hu/mailman/listinfo/libav-user