--- a/src/modules/avformat/filter_avcolour_space.c +++ b/src/modules/avformat/filter_avcolour_space.c @@ -124,26 +124,18 @@ static int set_luma_transfer( struct Sws static int av_convert_image( uint8_t *out, uint8_t *in, int out_fmt, int in_fmt, int width, int height, int src_colorspace, int dst_colorspace, int use_full_range ) { - uint8_t *in_data[4]; - int in_stride[4]; - uint8_t *out_data[4]; - int out_stride[4]; + AVPicture input; + AVPicture output; int flags = SWS_BICUBIC | SWS_ACCURATE_RND; int error = -1; - if ( out_fmt == AV_PIX_FMT_YUYV422 || out_fmt == AV_PIX_FMT_YUV422P16LE ) + if ( out_fmt == AV_PIX_FMT_YUYV422 ) flags |= SWS_FULL_CHR_H_INP; else flags |= SWS_FULL_CHR_H_INT; - if ( in_fmt == AV_PIX_FMT_YUV422P16LE ) - mlt_image_format_planes(mlt_image_yuv422p16, width, height, in, in_data, in_stride); - else - av_image_fill_arrays(in_data, in_stride, in, in_fmt, width, height, IMAGE_ALIGN); - if ( out_fmt == AV_PIX_FMT_YUV422P16LE ) - mlt_image_format_planes(mlt_image_yuv422p16, width, height, out, out_data, out_stride); - else - av_image_fill_arrays(out_data, out_stride, out, out_fmt, width, height, IMAGE_ALIGN); + avpicture_fill( &input, in, in_fmt, width, height ); + avpicture_fill( &output, out, out_fmt, width, height ); struct SwsContext *context = sws_getContext( width, height, in_fmt, width, height, out_fmt, flags, NULL, NULL, NULL); if ( context ) @@ -152,8 +144,8 @@ static int av_convert_image( uint8_t *ou if ( out_fmt == AV_PIX_FMT_RGB24 || out_fmt == AV_PIX_FMT_RGBA ) dst_colorspace = 601; error = set_luma_transfer( context, src_colorspace, dst_colorspace, use_full_range ); - sws_scale(context, (const uint8_t* const*) in_data, in_stride, 0, height, - out_data, out_stride); + sws_scale( context, (const uint8_t* const*) input.data, input.linesize, 0, height, + output.data, output.linesize); sws_freeContext( context ); } return error; @@ -183,7 +175,7 @@ static int convert_image( mlt_frame fram int in_fmt = convert_mlt_to_av_cs( *format ); int out_fmt = convert_mlt_to_av_cs( output_format ); - int size = FFMAX( av_image_get_buffer_size(out_fmt, width, height, IMAGE_ALIGN), + int size = FFMAX( avpicture_get_size(out_fmt, width, height), mlt_image_format_size( output_format, width, height, NULL ) ); uint8_t *output = mlt_pool_alloc( size ); --- a/src/modules/avformat/filter_avdeinterlace.c +++ b/src/modules/avformat/filter_avdeinterlace.c @@ -231,8 +231,8 @@ static inline void deinterlace_bottom_fi /* deinterlace - if not supported return -1 */ -static int mlt_avpicture_deinterlace(uint8_t *dst_data[4], int dst_stride[4], - uint8_t *src_data[4], int src_stride[4], int pix_fmt, int width, int height) +static int mlt_avpicture_deinterlace(AVPicture *dst, const AVPicture *src, + int pix_fmt, int width, int height) { int i; @@ -240,12 +240,12 @@ static int mlt_avpicture_deinterlace(uin pix_fmt != AV_PIX_FMT_YUV422P && pix_fmt != AV_PIX_FMT_YUYV422 && pix_fmt != AV_PIX_FMT_YUV444P && - pix_fmt != AV_PIX_FMT_YUV411P) + pix_fmt != AV_PIX_FMT_YUV411P) return -1; if ((width & 3) != 0 || (height & 3) != 0) return -1; - if ( pix_fmt != AV_PIX_FMT_YUYV422 ) + if ( pix_fmt != AV_PIX_FMT_YUYV422 ) { for(i=0;i<3;i++) { if (i == 1) { @@ -264,23 +264,23 @@ static int mlt_avpicture_deinterlace(uin break; } } - if (src_data[0] == dst_data[0]) { - deinterlace_bottom_field_inplace(dst_data[i], dst_stride[i], + if (src == dst) { + deinterlace_bottom_field_inplace(dst->data[i], dst->linesize[i], width, height); } else { - deinterlace_bottom_field(dst_data[i], dst_stride[i], - src_data[i], src_stride[i], + deinterlace_bottom_field(dst->data[i],dst->linesize[i], + src->data[i], src->linesize[i], width, height); } } } else { - if (src_data[0] == dst_data[0]) { - deinterlace_bottom_field_inplace(dst_data[0], dst_stride[0], + if (src == dst) { + deinterlace_bottom_field_inplace(dst->data[0], dst->linesize[0], width<<1, height); } else { - deinterlace_bottom_field(dst_data[0], dst_stride[0], - src_data[0], src_stride[0], + deinterlace_bottom_field(dst->data[0],dst->linesize[0], + src->data[0], src->linesize[0], width<<1, height); } } @@ -311,14 +311,14 @@ static int filter_get_image( mlt_frame f if ( deinterlace && *format == mlt_image_yuv422 && *image != NULL && !mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "progressive" ) ) { // Create a picture - uint8_t *image_data[4]; - int strides[4]; + AVPicture *output = mlt_pool_alloc( sizeof( AVPicture ) ); // Fill the picture - av_image_fill_arrays(image_data, strides, *image, AV_PIX_FMT_YUYV422, *width, *height, 1); - mlt_log_timings_begin(); - mlt_avpicture_deinterlace( image_data, strides, image_data, strides, AV_PIX_FMT_YUYV422, *width, *height ); - mlt_log_timings_end( NULL, "mlt_avpicture_deinterlace" ); + avpicture_fill( output, *image, AV_PIX_FMT_YUYV422, *width, *height ); + mlt_avpicture_deinterlace( output, output, AV_PIX_FMT_YUYV422, *width, *height ); + + // Free the picture + mlt_pool_release( output ); // Make sure that others know the frame is deinterlaced mlt_properties_set_int( MLT_FRAME_PROPERTIES( frame ), "progressive", 1 ); --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -1442,26 +1442,24 @@ static int convert_image( producer_avfor { struct SwsContext *context = sws_getContext( width, height, src_pix_fmt, width, height, AV_PIX_FMT_RGB24, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL); - uint8_t *out_data[4]; - int out_stride[4]; - av_image_fill_arrays(out_data, out_stride, buffer, AV_PIX_FMT_RGB24, width, height, IMAGE_ALIGN); + AVPicture output; + avpicture_fill( &output, buffer, AV_PIX_FMT_RGB24, width, height ); // libswscale wants the RGB colorspace to be SWS_CS_DEFAULT, which is = SWS_CS_ITU601. set_luma_transfer( context, self->yuv_colorspace, 601, self->full_luma, 0 ); sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height, - out_data, out_stride); + output.data, output.linesize); sws_freeContext( context ); } else if ( *format == mlt_image_rgb24a || *format == mlt_image_opengl ) { struct SwsContext *context = sws_getContext( width, height, src_pix_fmt, width, height, AV_PIX_FMT_RGBA, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL); - uint8_t *out_data[4]; - int out_stride[4]; - av_image_fill_arrays(out_data, out_stride, buffer, AV_PIX_FMT_RGBA, width, height, IMAGE_ALIGN); + AVPicture output; + avpicture_fill( &output, buffer, AV_PIX_FMT_RGBA, width, height ); // libswscale wants the RGB colorspace to be SWS_CS_DEFAULT, which is = SWS_CS_ITU601. set_luma_transfer( context, self->yuv_colorspace, 601, self->full_luma, 0 ); sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height, - out_data, out_stride); + output.data, output.linesize); sws_freeContext( context ); } else @@ -1480,7 +1478,7 @@ static int convert_image( producer_avfor .src_full_range = self->full_luma, .dst_full_range = 0, }; -#if defined(FFUDIV) && (LIBAVFORMAT_VERSION_INT >= ((55<<16)+(48<<8)+100)) +#if 0 ctx.src_format = src_pix_fmt; #else ctx.src_format = pix_fmt; --- a/src/modules/avformat/filter_swscale.c +++ b/src/modules/avformat/filter_swscale.c @@ -90,8 +90,9 @@ static int filter_scale( mlt_frame frame interp = SWS_SPLINE; interp |= SWS_ACCURATE_RND; - // Determine the output image size. - int out_size = mlt_image_format_size( *format, owidth, oheight, NULL ); + // Determine the bytes per pixel + int bpp; + mlt_image_format_size( *format, 0, 0, &bpp ); // Set swscale flags to get good quality switch ( *format ) @@ -115,28 +116,25 @@ static int filter_scale( mlt_frame frame int avformat = convert_mlt_to_av_cs( *format ); // Fill out the AVPictures - uint8_t *in_data[4]; - int in_stride[4]; - uint8_t *out_data[4]; - int out_stride[4]; - uint8_t *outbuf = mlt_pool_alloc( out_size ); - - av_image_fill_arrays(in_data, in_stride, *image, avformat, iwidth, iheight, IMAGE_ALIGN); - av_image_fill_arrays(out_data, out_stride, outbuf, avformat, owidth, oheight, IMAGE_ALIGN); + AVPicture input; + AVPicture output; + uint8_t *outbuf = mlt_pool_alloc( owidth * ( oheight + 1 ) * bpp ); + avpicture_fill( &input, *image, avformat, iwidth, iheight ); + avpicture_fill( &output, outbuf, avformat, owidth, oheight ); // Create the context and output image struct SwsContext *context = sws_getContext( iwidth, iheight, avformat, owidth, oheight, avformat, interp, NULL, NULL, NULL); if ( context ) { // Perform the scaling - sws_scale( context, (const uint8_t **) in_data, in_stride, 0, iheight, out_data, out_stride); + sws_scale( context, (const uint8_t* const*) input.data, input.linesize, 0, iheight, output.data, output.linesize); sws_freeContext( context ); // Now update the frame - mlt_frame_set_image( frame, outbuf, out_size, mlt_pool_release ); + mlt_frame_set_image( frame, output.data[0], owidth * ( oheight + 1 ) * bpp, mlt_pool_release ); // Return the output - *image = outbuf; + *image = output.data[0]; // Scale the alpha channel only if exists and not correct size int alpha_size = 0; @@ -149,16 +147,16 @@ static int filter_scale( mlt_frame frame { avformat = AV_PIX_FMT_GRAY8; struct SwsContext *context = sws_getContext( iwidth, iheight, avformat, owidth, oheight, avformat, interp, NULL, NULL, NULL); + avpicture_fill( &input, alpha, avformat, iwidth, iheight ); outbuf = mlt_pool_alloc( owidth * oheight ); - av_image_fill_arrays(in_data, in_stride, alpha, avformat, iwidth, iheight, IMAGE_ALIGN); - av_image_fill_arrays(out_data, out_stride, outbuf, avformat, owidth, oheight, IMAGE_ALIGN); + avpicture_fill( &output, outbuf, avformat, owidth, oheight ); // Perform the scaling - sws_scale( context, (const uint8_t **) in_data, in_stride, 0, iheight, out_data, out_stride); + sws_scale( context, (const uint8_t* const*) input.data, input.linesize, 0, iheight, output.data, output.linesize); sws_freeContext( context ); // Set it back on the frame - mlt_frame_set_alpha( frame, outbuf, owidth * oheight, mlt_pool_release ); + mlt_frame_set_alpha( frame, output.data[0], owidth * oheight, mlt_pool_release ); } }