On Thu, Aug 26, 2021 at 9:17 PM Colossus <[email protected]> wrote:
> On Thu, 26 Aug 2021 at 21:12, Paul B Mahol <[email protected]> wrote: > >> >> Probably because you mux incorrectly... >> > > Most probably but where is the documentation about muxing "correctly"? > I check the return value of all the av functions I call. *No errors.* > > Can you please point to some projects who *don't* load a video file > and encode into another but instead take a piece of data from > memory and fill the AVFrame->data? That would be very very helpful. > send/receive packet/frame works in loops, and you need to follow examples, sorry but my free consulting time is over. > > Thanks > Giuseppe > >> >> >>> >>> if you want to give a look to the software: >>> http://imagination.sourceforge.net/ >>> >>> Many thanks >>> Giuseppe >>> >>> On Thu, 26 Aug 2021 at 20:16, Paul B Mahol <[email protected]> wrote: >>> >>>> >>>> >>>> On Wed, Aug 18, 2021 at 1:17 PM Colossus <[email protected]> wrote: >>>> >>>>> Ok, I reordered the code. I don't get anymore the annoying message >>>>> 'input picture width greater than stride' but I get a crash in >>>>> memalloc() called >>>>> by av_send_frame(). >>>>> >>>>> *This is the gdb output:* >>>>> Thread 1 "imagination" received signal SIGABRT, Aborted. >>>>> __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 >>>>> 50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. >>>>> (gdb) bt >>>>> #0 __GI_raise (sig=sig@entry=6) at >>>>> ../sysdeps/unix/sysv/linux/raise.c:50 >>>>> #1 0x00007ffff5518537 in __GI_abort () at abort.c:79 >>>>> #2 0x00007ffff5571768 in __libc_message (action=action@entry=do_abort, >>>>> fmt=fmt@entry=0x7ffff567fe2d "%s\n") >>>>> at ../sysdeps/posix/libc_fatal.c:155 >>>>> #3 0x00007ffff5578a5a in malloc_printerr (str=str@entry=0x7ffff5682110 >>>>> "malloc_consolidate(): invalid chunk size") >>>>> at malloc.c:5347 >>>>> #4 0x00007ffff5579918 in malloc_consolidate (av=av@entry=0x7ffff56b1b80 >>>>> <main_arena>) at malloc.c:4477 >>>>> #5 0x00007ffff557b755 in _int_malloc (av=av@entry=0x7ffff56b1b80 >>>>> <main_arena>, bytes=bytes@entry=16288) at malloc.c:3699 >>>>> #6 0x00007ffff557c4af in _int_memalign >>>>> (av=av@entry=0x7ffff56b1b80 <main_arena>, >>>>> alignment=alignment@entry=64, bytes=bytes@entry=16176) at >>>>> malloc.c:4684 >>>>> #7 0x00007ffff557d55c in _mid_memalign (alignment=64, bytes=16176, >>>>> address=<optimized out>) at malloc.c:3312 >>>>> #8 0x00007ffff1e9fb2a in x264_malloc () at >>>>> /lib/x86_64-linux-gnu/libx264.so.160 >>>>> #9 0x00007ffff1eba75c in () at /lib/x86_64-linux-gnu/libx264.so.160 >>>>> #10 0x00007ffff1ebe6b0 in () at /lib/x86_64-linux-gnu/libx264.so.160 >>>>> #11 0x00007ffff1f27957 in () at /lib/x86_64-linux-gnu/libx264.so.160 >>>>> #12 0x00007ffff1ea4aa1 in x264_encoder_encode () at >>>>> /lib/x86_64-linux-gnu/libx264.so.160 >>>>> #13 0x00007ffff62df6d8 in () at /lib/x86_64-linux-gnu/libavcodec.so.58 >>>>> #14 0x00007ffff6094c37 in avcodec_encode_video2 () at >>>>> /lib/x86_64-linux-gnu/libavcodec.so.58 >>>>> #15 0x00007ffff6095012 in () at /lib/x86_64-linux-gnu/libavcodec.so.58 >>>>> #16 0x00007ffff609519f in *avcodec_send_frame* () at >>>>> /lib/x86_64-linux-gnu/libavcodec.so.58 >>>>> #17 0x000055555557aaae in img_export_encode_av_frame >>>>> (pkt=0x5555556e6d60, ctx=0x55555643cb40, fmt=0x5555564859c0, >>>>> frame=<optimized out>) at export.c:968 >>>>> >>>>> And this is the code: >>>>> static gboolean img_export_frame_to_avframe(img_window_struct *img, >>>>> cairo_surface_t *surface) >>>>> { >>>>> static gint i = 0; >>>>> >>>>> gint width, height, stride, row, col, offset, ret; >>>>> uint8_t *pix, *data; >>>>> AVFrame *frame; >>>>> >>>>> /* Image info and pixel data */ >>>>> width = cairo_image_surface_get_width( surface ); >>>>> height = cairo_image_surface_get_height( surface ); >>>>> stride = cairo_image_surface_get_stride( surface ); >>>>> pix = cairo_image_surface_get_data( surface ); >>>>> >>>>> /* Initialize AVFrame to be sent to the encoder */ >>>>> frame = av_frame_alloc(); >>>>> frame->format = img->codec_context->pix_fmt; >>>>> frame->width = img->video_size[0]; >>>>> frame->height = img->video_size[1]; >>>>> av_frame_get_buffer(frame, 32); >>>>> >>>> >>>> Why 32?, in doxy 0 is recommended, unless programmer know exactly what >>>> he is doing. >>>> >>>> >>>>> /* Fill the frame data with pixels from the Cairo surface */ >>>>> for( row = 0; row < height; row++ ) >>>>> { >>>>> data = pix + row * stride; >>>>> for( col = 0; col < width; col++ ) >>>>> { >>>>> frame->data[0][row * frame->linesize[0] + col] = data[2]; >>>>> frame->data[1][row * frame->linesize[1] + col] = data[1]; >>>>> frame->data[2][row * frame->linesize[2] + col] = data[0]; >>>>> data += 4; >>>>> } >>>>> frame->pts = i; >>>>> i++; >>>>> } >>>>> //sws_scale(img->sws_ctx, pix, img->video_frame->linesize, 0, >>>>> img->video_frame->height, img->video_frame->data, sws_frame->linesize); >>>>> >>>>> ret = img_export_encode_av_frame(frame, img->video_format_context, >>>>> img->codec_context, &img->video_packet); >>>>> >>>>> if (frame) >>>>> { >>>>> av_frame_free(&frame); >>>>> frame = NULL; >>>>> } >>>>> return ret; >>>>> } >>>>> >>>>> gboolean img_export_encode_av_frame(AVFrame *frame, AVFormatContext >>>>> *fmt, AVCodecContext *ctx, AVPacket *pkt) >>>>> { >>>>> gint ret; >>>>> >>>>> /* send the frame to the encoder */ >>>>> ret = *avcodec_send_frame*(ctx, frame); >>>>> if (ret < 0) >>>>> { >>>>> g_print("Av error: %s\n",av_err2str(ret)); >>>>> g_print("Error sending a frame for encoding\n"); >>>>> return FALSE; >>>>> } >>>>> while (ret >= 0) >>>>> { >>>>> ret = avcodec_receive_packet(ctx, pkt); >>>>> if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) >>>>> return TRUE; >>>>> else if (ret < 0) >>>>> g_print("Error during encoding\n"); >>>>> >>>>> av_interleaved_write_frame(fmt, pkt); >>>>> av_packet_unref(pkt); >>>>> return FALSE; >>>>> } >>>>> return TRUE; >>>>> } >>>>> >>>>> What can be the cause of the crash now? >>>>> >>>> >>>> Check with valgrind or similar for buffer overreads or overwrites. >>>> >>>> >>>>> >>>>> Thanks >>>>> >>>>> On Mon, 16 Aug 2021 at 16:35, Nicolas George <[email protected]> wrote: >>>>> >>>>>> Colossus (12021-08-16): >>>>>> > I told you I did and avcodec_send_frame() is the one that throws >>>>>> that error. >>>>>> >>>>>> I will trust the code I see. Re-post your code once you have fixed the >>>>>> order of the function calls and checked all the return values >>>>>> properly, >>>>>> if it still does not work. >>>>>> >>>>>> -- >>>>>> Nicolas George >>>>>> _______________________________________________ >>>>>> Libav-user mailing list >>>>>> [email protected] >>>>>> https://ffmpeg.org/mailman/listinfo/libav-user >>>>>> >>>>>> To unsubscribe, visit link above, or email >>>>>> [email protected] with subject "unsubscribe". >>>>>> >>>>> _______________________________________________ >>>>> Libav-user mailing list >>>>> [email protected] >>>>> https://ffmpeg.org/mailman/listinfo/libav-user >>>>> >>>>> To unsubscribe, visit link above, or email >>>>> [email protected] with subject "unsubscribe". >>>>> >>>> _______________________________________________ >>>> Libav-user mailing list >>>> [email protected] >>>> https://ffmpeg.org/mailman/listinfo/libav-user >>>> >>>> To unsubscribe, visit link above, or email >>>> [email protected] with subject "unsubscribe". >>>> >>> _______________________________________________ >>> Libav-user mailing list >>> [email protected] >>> https://ffmpeg.org/mailman/listinfo/libav-user >>> >>> To unsubscribe, visit link above, or email >>> [email protected] with subject "unsubscribe". >>> >> _______________________________________________ >> Libav-user mailing list >> [email protected] >> https://ffmpeg.org/mailman/listinfo/libav-user >> >> To unsubscribe, visit link above, or email >> [email protected] with subject "unsubscribe". >> > _______________________________________________ > Libav-user mailing list > [email protected] > https://ffmpeg.org/mailman/listinfo/libav-user > > To unsubscribe, visit link above, or email > [email protected] with subject "unsubscribe". >
_______________________________________________ Libav-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
