diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index 59276e815..2ef3d265f 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -1160,7 +1160,7 @@ bool FFmpegReader::GetAVFrame() { // Use only the first frame like avcodec_decode_video2 if (frameFinished == 0 ) { frameFinished = 1; - av_image_alloc(pFrame->data, pFrame->linesize, info.width, info.height, (AVPixelFormat)(pStream->codecpar->format), 1); + av_image_alloc(pFrame->data, pFrame->linesize, info.width, info.height, (AVPixelFormat)(pStream->codecpar->format), 32); av_image_copy(pFrame->data, pFrame->linesize, (const uint8_t**)next_frame->data, next_frame->linesize, (AVPixelFormat)(pStream->codecpar->format), info.width, info.height); } @@ -1374,10 +1374,10 @@ void FFmpegReader::ProcessVideoPacket(int64_t requested_frame) { // Add Image data to frame if (!ffmpeg_has_alpha(AV_GET_CODEC_PIXEL_FORMAT(pStream, pCodecCtx))) { // Add image with no alpha channel, Speed optimization - f->AddImage(width, height, 4, QImage::Format_RGBA8888_Premultiplied, buffer); + f->AddImage(width, height, 4, pFrameRGB->linesize[0], QImage::Format_RGBA8888_Premultiplied, buffer); } else { // Add image with alpha channel (this will be converted to premultipled when needed, but is slower) - f->AddImage(width, height, 4, QImage::Format_RGBA8888, buffer); + f->AddImage(width, height, 4, pFrameRGB->linesize[0], QImage::Format_RGBA8888, buffer); } // Update working cache diff --git a/src/FFmpegUtilities.h b/src/FFmpegUtilities.h index 2f914128a..7f46f2fc5 100644 --- a/src/FFmpegUtilities.h +++ b/src/FFmpegUtilities.h @@ -165,7 +165,7 @@ #define AV_SET_FILENAME(oc, f) oc->AV_FILENAME = av_strdup(f) #define MY_INPUT_BUFFER_PADDING_SIZE AV_INPUT_BUFFER_PADDING_SIZE #define AV_ALLOCATE_FRAME() av_frame_alloc() - #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1) + #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, av_cpu_max_align()) #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame) #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame) #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet) @@ -181,8 +181,8 @@ #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) (AVPixelFormat) av_stream->codecpar->format #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format - #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 1) - #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1) + #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, av_cpu_max_align()) + #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, av_cpu_max_align()) #define AV_OUTPUT_CONTEXT(output_context, path) avformat_alloc_output_context2( output_context, NULL, NULL, path) #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0) #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) av_opt_set(priv_data, name, value, 0); avcodec_parameters_from_context(av_stream->codecpar, avcodec); @@ -200,7 +200,7 @@ #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f) #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE #define AV_ALLOCATE_FRAME() av_frame_alloc() - #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1) + #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 32) #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame) #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame) #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet) @@ -216,8 +216,8 @@ #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) (AVPixelFormat) av_stream->codecpar->format #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format - #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 1) - #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1) + #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 32) + #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 32) #define AV_OUTPUT_CONTEXT(output_context, path) avformat_alloc_output_context2( output_context, NULL, NULL, path) #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0) #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) av_opt_set(priv_data, name, value, 0); avcodec_parameters_from_context(av_stream->codecpar, avcodec); diff --git a/src/Frame.cpp b/src/Frame.cpp index d25def6dd..938223365 100644 --- a/src/Frame.cpp +++ b/src/Frame.cpp @@ -769,13 +769,14 @@ void Frame::AddColor(int new_width, int new_height, std::string new_color) // Add (or replace) pixel data to the frame void Frame::AddImage( - int new_width, int new_height, int bytes_per_pixel, + int new_width, int new_height, + int bytes_per_pixel, int bytes_per_line, QImage::Format type, const unsigned char *pixels_) { // Create new buffer { const GenericScopedLock lock(addingImageSection); - int buffer_size = new_width * new_height * bytes_per_pixel; + int buffer_size = bytes_per_line * new_height; qbuffer = new unsigned char[buffer_size](); // Copy buffer data diff --git a/src/Frame.h b/src/Frame.h index 75976f17b..62631a8db 100644 --- a/src/Frame.h +++ b/src/Frame.h @@ -161,8 +161,8 @@ namespace openshot void AddColor(int new_width, int new_height, std::string new_color); /// Add (or replace) pixel data to the frame - void AddImage(int new_width, int new_height, int bytes_per_pixel, QImage::Format type, const unsigned char *pixels_); - + void AddImage(int new_width, int new_height, int bytes_per_pixel, int bytes_per_line, QImage::Format type, const unsigned char *pixels_); + /// Add (or replace) pixel data to the frame void AddImage(std::shared_ptr new_image);