1. 介绍
如果想在两个AVPixelFormat之间转换,例如将YUV420P 转换到YUV422,亦或者是要改变其大小,放大缩小什么的,就要用到ffmpeg中的swscale函数了,此版本基于ffmpeg 3.3.3版本开发
1. AVPixelFormat定义
-
enum AVPixelFormat {
-
AV_PIX_FMT_NONE =
-1,
-
AV_PIX_FMT_YUV420P,
///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
-
AV_PIX_FMT_YUYV422,
///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
-
AV_PIX_FMT_RGB24,
///< packed RGB 8:8:8, 24bpp, RGBRGB…
-
AV_PIX_FMT_BGR24,
///< packed RGB 8:8:8, 24bpp, BGRBGR…
-
AV_PIX_FMT_YUV422P,
///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
-
AV_PIX_FMT_YUV444P,
///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
-
AV_PIX_FMT_YUV410P,
///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
-
AV_PIX_FMT_YUV411P,
///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
-
AV_PIX_FMT_GRAY8,
///< Y , 8bpp
-
AV_PIX_FMT_MONOWHITE,
///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
-
AV_PIX_FMT_MONOBLACK,
///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
-
AV_PIX_FMT_PAL8,
///< 8 bits with AV_PIX_FMT_RGB32 palette
-
AV_PIX_FMT_YUVJ420P,
///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
-
AV_PIX_FMT_YUVJ422P,
///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range
-
AV_PIX_FMT_YUVJ444P,
///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range
-
#
if FF_API_XVMC
-
AV_PIX_FMT_XVMC_MPEG2_MC,
///< XVideo Motion Acceleration via common packet passing
-
AV_PIX_FMT_XVMC_MPEG2_IDCT,
-
AV_PIX_FMT_XVMC = AV_PIX_FMT_XVMC_MPEG2_IDCT,
-
#endif
/* FF_API_XVMC */
-
AV_PIX_FMT_UYVY422,
///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
-
AV_PIX_FMT_UYYVYY411,
///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
-
AV_PIX_FMT_BGR8,
///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
-
AV_PIX_FMT_BGR4,
///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
-
AV_PIX_FMT_BGR4_BYTE,
///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
-
AV_PIX_FMT_RGB8,
///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
-
AV_PIX_FMT_RGB4,
///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
-
AV_PIX_FMT_RGB4_BYTE,
///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
-
AV_PIX_FMT_NV12,
///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
-
AV_PIX_FMT_NV21,
///< as above, but U and V bytes are swapped
-
-
AV_PIX_FMT_ARGB,
///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB…
-
AV_PIX_FMT_RGBA,
///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA…
-
AV_PIX_FMT_ABGR,
///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR…
-
AV_PIX_FMT_BGRA,
///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA…
-
-
AV_PIX_FMT_GRAY16BE,
///< Y , 16bpp, big-endian
-
AV_PIX_FMT_GRAY16LE,
///< Y , 16bpp, little-endian
-
AV_PIX_FMT_YUV440P,
///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
-
AV_PIX_FMT_YUVJ440P,
///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
-
AV_PIX_FMT_YUVA420P,
///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
-
#
if FF_API_VDPAU
-
AV_PIX_FMT_VDPAU_H264,
///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_MPEG1,
///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_MPEG2,
///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_WMV3,
///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_VC1,
///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
#endif
-
AV_PIX_FMT_RGB48BE,
///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
-
AV_PIX_FMT_RGB48LE,
///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
-
-
AV_PIX_FMT_RGB565BE,
///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
-
AV_PIX_FMT_RGB565LE,
///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
-
AV_PIX_FMT_RGB555BE,
///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
-
AV_PIX_FMT_RGB555LE,
///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
-
-
AV_PIX_FMT_BGR565BE,
///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
-
AV_PIX_FMT_BGR565LE,
///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
-
AV_PIX_FMT_BGR555BE,
///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
-
AV_PIX_FMT_BGR555LE,
///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
-
-
#
if FF_API_VAAPI
-
/** @name Deprecated pixel formats */
-
/**@{*/
-
AV_PIX_FMT_VAAPI_MOCO,
///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
-
AV_PIX_FMT_VAAPI_IDCT,
///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
-
AV_PIX_FMT_VAAPI_VLD,
///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID
-
/**@}*/
-
AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD,
-
#
else
-
/**
-
* Hardware acceleration through VA-API, data[3] contains a
-
* VASurfaceID.
-
*/
-
AV_PIX_FMT_VAAPI,
-
#endif
-
-
AV_PIX_FMT_YUV420P16LE,
///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P16BE,
///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV422P16LE,
///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P16BE,
///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P16LE,
///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P16BE,
///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
#
if FF_API_VDPAU
-
AV_PIX_FMT_VDPAU_MPEG4,
///< MPEG-4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
#endif
-
AV_PIX_FMT_DXVA2_VLD,
///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
-
-
AV_PIX_FMT_RGB444LE,
///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
-
AV_PIX_FMT_RGB444BE,
///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
-
AV_PIX_FMT_BGR444LE,
///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
-
AV_PIX_FMT_BGR444BE,
///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
-
AV_PIX_FMT_YA8,
///< 8 bits gray, 8 bits alpha
-
-
AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8,
///< alias for AV_PIX_FMT_YA8
-
AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8,
///< alias for AV_PIX_FMT_YA8
-
-
AV_PIX_FMT_BGR48BE,
///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
-
AV_PIX_FMT_BGR48LE,
///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
-
-
/**
-
* The following 12 formats have the disadvantage of needing 1 format for each bit depth.
-
* Notice that each 9/10 bits sample is stored in 16 bits with extra padding.
-
* If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.
-
*/
-
AV_PIX_FMT_YUV420P9BE,
///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P9LE,
///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P10BE,
///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P10LE,
///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV422P10BE,
///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P10LE,
///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P9BE,
///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P9LE,
///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P10BE,
///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P10LE,
///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P9BE,
///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P9LE,
///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_VDA_VLD,
///< hardware decoding through VDA
-
AV_PIX_FMT_GBRP,
///< planar GBR 4:4:4 24bpp
-
AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP,
// alias for #AV_PIX_FMT_GBRP
-
AV_PIX_FMT_GBRP9BE,
///< planar GBR 4:4:4 27bpp, big-endian
-
AV_PIX_FMT_GBRP9LE,
///< planar GBR 4:4:4 27bpp, little-endian
-
AV_PIX_FMT_GBRP10BE,
///< planar GBR 4:4:4 30bpp, big-endian
-
AV_PIX_FMT_GBRP10LE,
///< planar GBR 4:4:4 30bpp, little-endian
-
AV_PIX_FMT_GBRP16BE,
///< planar GBR 4:4:4 48bpp, big-endian
-
AV_PIX_FMT_GBRP16LE,
///< planar GBR 4:4:4 48bpp, little-endian
-
AV_PIX_FMT_YUVA422P,
///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
-
AV_PIX_FMT_YUVA444P,
///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
-
AV_PIX_FMT_YUVA420P9BE,
///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA420P9LE,
///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA422P9BE,
///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA422P9LE,
///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA444P9BE,
///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA444P9LE,
///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA420P10BE,
///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA420P10LE,
///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA422P10BE,
///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA422P10LE,
///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA444P10BE,
///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA444P10LE,
///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA420P16BE,
///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA420P16LE,
///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA422P16BE,
///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA422P16LE,
///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA444P16BE,
///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA444P16LE,
///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
-
-
AV_PIX_FMT_VDPAU,
///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface
-
-
AV_PIX_FMT_XYZ12LE,
///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0
-
AV_PIX_FMT_XYZ12BE,
///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0
-
AV_PIX_FMT_NV16,
///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
-
AV_PIX_FMT_NV20LE,
///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_NV20BE,
///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
-
AV_PIX_FMT_RGBA64BE,
///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
-
AV_PIX_FMT_RGBA64LE,
///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
-
AV_PIX_FMT_BGRA64BE,
///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
-
AV_PIX_FMT_BGRA64LE,
///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
-
-
AV_PIX_FMT_YVYU422,
///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
-
-
AV_PIX_FMT_VDA,
///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef
-
-
AV_PIX_FMT_YA16BE,
///< 16 bits gray, 16 bits alpha (big-endian)
-
AV_PIX_FMT_YA16LE,
///< 16 bits gray, 16 bits alpha (little-endian)
-
-
AV_PIX_FMT_GBRAP,
///< planar GBRA 4:4:4:4 32bpp
-
AV_PIX_FMT_GBRAP16BE,
///< planar GBRA 4:4:4:4 64bpp, big-endian
-
AV_PIX_FMT_GBRAP16LE,
///< planar GBRA 4:4:4:4 64bpp, little-endian
-
/**
-
* HW acceleration through QSV, data[3] contains a pointer to the
-
* mfxFrameSurface1 structure.
-
*/
-
AV_PIX_FMT_QSV,
-
/**
-
* HW acceleration though MMAL, data[3] contains a pointer to the
-
* MMAL_BUFFER_HEADER_T structure.
-
*/
-
AV_PIX_FMT_MMAL,
-
-
AV_PIX_FMT_D3D11VA_VLD,
///< HW decoding through Direct3D11, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer
-
-
/**
-
* HW acceleration through CUDA. data[i] contain CUdeviceptr pointers
-
* exactly as for system memory frames.
-
*/
-
AV_PIX_FMT_CUDA,
-
-
AV_PIX_FMT_0RGB=
0x123+
4,
///< packed RGB 8:8:8, 32bpp, XRGBXRGB… X=unused/undefined
-
AV_PIX_FMT_RGB0,
///< packed RGB 8:8:8, 32bpp, RGBXRGBX… X=unused/undefined
-
AV_PIX_FMT_0BGR,
///< packed BGR 8:8:8, 32bpp, XBGRXBGR… X=unused/undefined
-
AV_PIX_FMT_BGR0,
///< packed BGR 8:8:8, 32bpp, BGRXBGRX… X=unused/undefined
-
-
AV_PIX_FMT_YUV420P12BE,
///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P12LE,
///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P14BE,
///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P14LE,
///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV422P12BE,
///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P12LE,
///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P14BE,
///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P14LE,
///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P12BE,
///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P12LE,
///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P14BE,
///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P14LE,
///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_GBRP12BE,
///< planar GBR 4:4:4 36bpp, big-endian
-
AV_PIX_FMT_GBRP12LE,
///< planar GBR 4:4:4 36bpp, little-endian
-
AV_PIX_FMT_GBRP14BE,
///< planar GBR 4:4:4 42bpp, big-endian
-
AV_PIX_FMT_GBRP14LE,
///< planar GBR 4:4:4 42bpp, little-endian
-
AV_PIX_FMT_YUVJ411P,
///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range
-
-
AV_PIX_FMT_BAYER_BGGR8,
///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_RGGB8,
///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_GBRG8,
///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_GRBG8,
///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_BGGR16LE,
///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_BGGR16BE,
///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_RGGB16LE,
///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_RGGB16BE,
///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_GBRG16LE,
///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_GBRG16BE,
///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_GRBG16LE,
///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_GRBG16BE,
///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */
-
#
if !FF_API_XVMC
-
AV_PIX_FMT_XVMC,
///< XVideo Motion Acceleration via common packet passing
-
#endif
/* !FF_API_XVMC */
-
AV_PIX_FMT_YUV440P10LE,
///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-
AV_PIX_FMT_YUV440P10BE,
///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-
AV_PIX_FMT_YUV440P12LE,
///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-
AV_PIX_FMT_YUV440P12BE,
///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-
AV_PIX_FMT_AYUV64LE,
///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
-
AV_PIX_FMT_AYUV64BE,
///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
-
-
AV_PIX_FMT_VIDEOTOOLBOX,
///< hardware decoding through Videotoolbox
-
-
AV_PIX_FMT_P010LE,
///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian
-
AV_PIX_FMT_P010BE,
///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian
-
-
AV_PIX_FMT_GBRAP12BE,
///< planar GBR 4:4:4:4 48bpp, big-endian
-
AV_PIX_FMT_GBRAP12LE,
///< planar GBR 4:4:4:4 48bpp, little-endian
-
-
AV_PIX_FMT_GBRAP10BE,
///< planar GBR 4:4:4:4 40bpp, big-endian
-
AV_PIX_FMT_GBRAP10LE,
///< planar GBR 4:4:4:4 40bpp, little-endian
-
-
AV_PIX_FMT_MEDIACODEC,
///< hardware decoding through MediaCodec
-
-
AV_PIX_FMT_GRAY12BE,
///< Y , 12bpp, big-endian
-
AV_PIX_FMT_GRAY12LE,
///< Y , 12bpp, little-endian
-
AV_PIX_FMT_GRAY10BE,
///< Y , 10bpp, big-endian
-
AV_PIX_FMT_GRAY10LE,
///< Y , 10bpp, little-endian
-
-
AV_PIX_FMT_P016LE,
///< like NV12, with 16bpp per component, little-endian
-
AV_PIX_FMT_P016BE,
///< like NV12, with 16bpp per component, big-endian
-
-
AV_PIX_FMT_NB
///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
-
};
swscale的用法其实还可以参照swscale-example.c来学习使用,主要用到如下三个函数:
-
av_warn_unused_result
-
int
sws_init_context
(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter);
-
-
/**
-
* Free the swscaler context swsContext.
-
* If swsContext is NULL, then does nothing.
-
*/
-
void sws_freeContext(struct SwsContext *swsContext);
-
-
/**
-
* Allocate and return an SwsContext. You need it to perform
-
* scaling/conversion operations using sws_scale().
-
*
-
* @param srcW the width of the source image
-
* @param srcH the height of the source image
-
* @param srcFormat the source image format
-
* @param dstW the width of the destination image
-
* @param dstH the height of the destination image
-
* @param dstFormat the destination image format
-
* @param flags specify which algorithm and options to use for rescaling
-
* @param param extra parameters to tune the used scaler
-
* For SWS_BICUBIC param[0] and [1] tune the shape of the basis
-
* function, param[0] tunes f(1) and param[1] f´(1)
-
* For SWS_GAUSS param[0] tunes the exponent and thus cutoff
-
* frequency
-
* For SWS_LANCZOS param[0] tunes the width of the window function
-
* @return a pointer to an allocated context, or NULL in case of error
-
* @note this function is to be removed after a saner alternative is
-
* written
-
*/
-
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
-
int dstW, int dstH, enum AVPixelFormat dstFormat,
-
int flags, SwsFilter *srcFilter,
-
SwsFilter *dstFilter, const double *param);
-
/**
-
* Scale the image slice in srcSlice and put the resulting scaled
-
* slice in the image in dst. A slice is a sequence of consecutive
-
* rows in an image.
-
*
-
* Slices have to be provided in sequential order, either in
-
* top-bottom or bottom-top order. If slices are provided in
-
* non-sequential order the behavior of the function is undefined.
-
*
-
* @param c the scaling context previously created with
-
* sws_getContext()
-
* @param srcSlice the array containing the pointers to the planes of
-
* the source slice
-
* @param srcStride the array containing the strides for each plane of
-
* the source image
-
* @param srcSliceY the position in the source image of the slice to
-
* process, that is the number (counted starting from
-
* zero) in the image of the first row of the slice
-
* @param srcSliceH the height of the source slice, that is the number
-
* of rows in the slice
-
* @param dst the array containing the pointers to the planes of
-
* the destination image
-
* @param dstStride the array containing the strides for each plane of
-
* the destination image
-
* @return the height of the output slice
-
*/
-
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
-
const
int srcStride[],
int srcSliceY,
int srcSliceH,
-
uint8_t *
const dst[],
const
int dstStride[]);
当然真正干活的当然是 sws_scale 函数了,具体函数参数可以自行看下具体定义,上面贴的代码里面有,需要注意的是第四个参数srcSliceY 这个代表的是第一列要处理的位置,如果要从头开始处理,直接填0即可,下面有一个完整的栗子,我也会上传到github上面,可以下载。
2. 实例
直接上代码了。。。
-
/*
-
* copyright (c) 2017 老衲不出家
-
*
-
* 2017-08-11
-
*
-
*/
-
-
#include <stdio.h>
-
#include <stdint.h>
-
#include <string.h>
-
-
extern
"C"
-
{
-
#include "libswscale/swscale.h"
-
#include "libavutil/pixfmt.h"
-
}
-
-
const
char *srcFileName =
"ds_480x272.yuv";
-
const
char *dstFileName =
"ds_720x576.yuv";
-
-
int main()
-
{
-
// 設定原始 YUV 的長寬
-
const
int in_width =
480;
-
const
int in_height =
272;
-
-
-
// 設定目的 YUV 的長寬
-
const
int out_width =
720;
-
const
int out_height =
576;
-
-
const
int read_size = in_width * in_height *
3 /
2;
-
const
int write_size = out_width * out_height *
3 /
2;
-
struct SwsContext *img_convert_ctx = nullptr;
-
-
uint8_t *inbuf[
4];
-
uint8_t *outbuf[
4];
-
-
int inlinesize[
4] = { in_width, in_width /
2, in_width /
2,
0 };
-
int outlinesize[
4] = { out_width, out_width /
2, out_width /
2,
0 };
-
-
uint8_t *ptr_src_yuv_buf =
nullptr;
-
uint8_t *ptr_dst_yuv_buf =
nullptr;
-
ptr_src_yuv_buf =
new
uint8_t[in_width * in_height *
3/
2];
-
ptr_dst_yuv_buf =
new
uint8_t[out_width * out_height *
3 /
2];
-
-
FILE *fin = fopen(srcFileName,
"rb");
-
FILE *fout = fopen(dstFileName,
"wb");
-
-
if (fin ==
NULL) {
-
fprintf(
stderr,
"open input file %s error.\n", srcFileName);
-
return
-1;
-
}
-
-
if (fout ==
NULL) {
-
fprintf(
stderr,
"open output file %s error.\n", dstFileName);
-
return
-1;
-
}
-
-
inbuf[
0] = (
uint8_t *)
malloc(in_width*in_height);
-
inbuf[
1] = (
uint8_t *)
malloc(in_width*in_height >>
2);
-
inbuf[
2] = (
uint8_t *)
malloc(in_width*in_height >>
2);
-
inbuf[
3] =
NULL;
-
-
outbuf[
0] = (
uint8_t *)
malloc(out_width*out_height);
-
outbuf[
1] = (
uint8_t *)
malloc(out_width*out_height >>
2);
-
outbuf[
2] = (
uint8_t *)
malloc(out_width*out_height >>
2);
-
outbuf[
3] =
NULL;
-
-
// ********* Initialize software scaling *********
-
// ********* sws_getContext **********************
-
img_convert_ctx = sws_getContext(in_width, in_height, AV_PIX_FMT_YUV420P,
-
out_width, out_height, AV_PIX_FMT_YUV420P, SWS_POINT,
nullptr,
nullptr,
nullptr);
-
if (img_convert_ctx ==
NULL) {
-
fprintf(
stderr,
"Cannot initialize the conversion context!\n");
-
return
-1;
-
}
-
-
int32_t in_y_size = in_width*in_height;
-
int32_t out_y_size;
-
-
bool bExit =
false;
-
while (!bExit) {
-
-
if ((fread(ptr_src_yuv_buf,
1, read_size, fin) <
0) || (feof(fin))) {
-
bExit =
true;
-
break;
-
}
-
-
memcpy(inbuf[
0], ptr_src_yuv_buf, in_y_size);
-
memcpy(inbuf[
1], ptr_src_yuv_buf + in_y_size, in_y_size/
4);
-
memcpy(inbuf[
2], ptr_src_yuv_buf + in_y_size*
5/
4, in_y_size /
4);
-
-
// ********* 主要的 function ******
-
// ********* sws_scale ************
-
sws_scale(img_convert_ctx, inbuf, inlinesize,
-
0, in_height, outbuf, outlinesize);
-
-
memcpy(ptr_dst_yuv_buf, outbuf[
0], out_width*out_height);
-
memcpy(ptr_dst_yuv_buf + out_width*out_height, outbuf[
1], out_width*out_height >>
2);
-
memcpy(ptr_dst_yuv_buf + (out_width*out_height *
5 >>
2), outbuf[
2], out_width*out_height >>
2);
-
-
fwrite(ptr_dst_yuv_buf,
1, write_size, fout);
-
}
-
// ********* 結束的 function *******
-
// ********* sws_freeContext *******
-
sws_freeContext(img_convert_ctx);
-
-
fclose(fin);
-
fclose(fout);
-
-
delete[] ptr_src_yuv_buf;
-
ptr_src_yuv_buf =
nullptr;
-
-
delete[] ptr_dst_yuv_buf;
-
ptr_dst_yuv_buf =
nullptr;
-
-
return
0;
-
}
整体就是输入一个yuv文件,然后放大,当然这个函数还可以进行其他很多操作。
git地址:https://github.com/tanningzhong/ffmpeg-sws_scale
转载自:https://blog.csdn.net/tanningzhong/article/details/77101239
1. 介绍
如果想在两个AVPixelFormat之间转换,例如将YUV420P 转换到YUV422,亦或者是要改变其大小,放大缩小什么的,就要用到ffmpeg中的swscale函数了,此版本基于ffmpeg 3.3.3版本开发
1. AVPixelFormat定义
-
enum AVPixelFormat {
-
AV_PIX_FMT_NONE =
-1,
-
AV_PIX_FMT_YUV420P,
///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
-
AV_PIX_FMT_YUYV422,
///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
-
AV_PIX_FMT_RGB24,
///< packed RGB 8:8:8, 24bpp, RGBRGB…
-
AV_PIX_FMT_BGR24,
///< packed RGB 8:8:8, 24bpp, BGRBGR…
-
AV_PIX_FMT_YUV422P,
///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
-
AV_PIX_FMT_YUV444P,
///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
-
AV_PIX_FMT_YUV410P,
///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
-
AV_PIX_FMT_YUV411P,
///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
-
AV_PIX_FMT_GRAY8,
///< Y , 8bpp
-
AV_PIX_FMT_MONOWHITE,
///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
-
AV_PIX_FMT_MONOBLACK,
///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
-
AV_PIX_FMT_PAL8,
///< 8 bits with AV_PIX_FMT_RGB32 palette
-
AV_PIX_FMT_YUVJ420P,
///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
-
AV_PIX_FMT_YUVJ422P,
///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range
-
AV_PIX_FMT_YUVJ444P,
///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range
-
#
if FF_API_XVMC
-
AV_PIX_FMT_XVMC_MPEG2_MC,
///< XVideo Motion Acceleration via common packet passing
-
AV_PIX_FMT_XVMC_MPEG2_IDCT,
-
AV_PIX_FMT_XVMC = AV_PIX_FMT_XVMC_MPEG2_IDCT,
-
#endif
/* FF_API_XVMC */
-
AV_PIX_FMT_UYVY422,
///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
-
AV_PIX_FMT_UYYVYY411,
///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
-
AV_PIX_FMT_BGR8,
///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
-
AV_PIX_FMT_BGR4,
///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
-
AV_PIX_FMT_BGR4_BYTE,
///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
-
AV_PIX_FMT_RGB8,
///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
-
AV_PIX_FMT_RGB4,
///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
-
AV_PIX_FMT_RGB4_BYTE,
///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
-
AV_PIX_FMT_NV12,
///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
-
AV_PIX_FMT_NV21,
///< as above, but U and V bytes are swapped
-
-
AV_PIX_FMT_ARGB,
///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB…
-
AV_PIX_FMT_RGBA,
///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA…
-
AV_PIX_FMT_ABGR,
///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR…
-
AV_PIX_FMT_BGRA,
///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA…
-
-
AV_PIX_FMT_GRAY16BE,
///< Y , 16bpp, big-endian
-
AV_PIX_FMT_GRAY16LE,
///< Y , 16bpp, little-endian
-
AV_PIX_FMT_YUV440P,
///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
-
AV_PIX_FMT_YUVJ440P,
///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
-
AV_PIX_FMT_YUVA420P,
///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
-
#
if FF_API_VDPAU
-
AV_PIX_FMT_VDPAU_H264,
///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_MPEG1,
///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_MPEG2,
///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_WMV3,
///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
AV_PIX_FMT_VDPAU_VC1,
///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
#endif
-
AV_PIX_FMT_RGB48BE,
///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
-
AV_PIX_FMT_RGB48LE,
///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
-
-
AV_PIX_FMT_RGB565BE,
///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
-
AV_PIX_FMT_RGB565LE,
///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
-
AV_PIX_FMT_RGB555BE,
///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
-
AV_PIX_FMT_RGB555LE,
///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
-
-
AV_PIX_FMT_BGR565BE,
///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
-
AV_PIX_FMT_BGR565LE,
///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
-
AV_PIX_FMT_BGR555BE,
///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
-
AV_PIX_FMT_BGR555LE,
///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
-
-
#
if FF_API_VAAPI
-
/** @name Deprecated pixel formats */
-
/**@{*/
-
AV_PIX_FMT_VAAPI_MOCO,
///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
-
AV_PIX_FMT_VAAPI_IDCT,
///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
-
AV_PIX_FMT_VAAPI_VLD,
///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID
-
/**@}*/
-
AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD,
-
#
else
-
/**
-
* Hardware acceleration through VA-API, data[3] contains a
-
* VASurfaceID.
-
*/
-
AV_PIX_FMT_VAAPI,
-
#endif
-
-
AV_PIX_FMT_YUV420P16LE,
///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P16BE,
///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV422P16LE,
///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P16BE,
///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P16LE,
///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P16BE,
///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
#
if FF_API_VDPAU
-
AV_PIX_FMT_VDPAU_MPEG4,
///< MPEG-4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
-
#endif
-
AV_PIX_FMT_DXVA2_VLD,
///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
-
-
AV_PIX_FMT_RGB444LE,
///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
-
AV_PIX_FMT_RGB444BE,
///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
-
AV_PIX_FMT_BGR444LE,
///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
-
AV_PIX_FMT_BGR444BE,
///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
-
AV_PIX_FMT_YA8,
///< 8 bits gray, 8 bits alpha
-
-
AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8,
///< alias for AV_PIX_FMT_YA8
-
AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8,
///< alias for AV_PIX_FMT_YA8
-
-
AV_PIX_FMT_BGR48BE,
///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
-
AV_PIX_FMT_BGR48LE,
///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
-
-
/**
-
* The following 12 formats have the disadvantage of needing 1 format for each bit depth.
-
* Notice that each 9/10 bits sample is stored in 16 bits with extra padding.
-
* If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.
-
*/
-
AV_PIX_FMT_YUV420P9BE,
///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P9LE,
///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P10BE,
///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P10LE,
///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV422P10BE,
///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P10LE,
///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P9BE,
///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P9LE,
///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P10BE,
///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P10LE,
///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P9BE,
///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P9LE,
///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_VDA_VLD,
///< hardware decoding through VDA
-
AV_PIX_FMT_GBRP,
///< planar GBR 4:4:4 24bpp
-
AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP,
// alias for #AV_PIX_FMT_GBRP
-
AV_PIX_FMT_GBRP9BE,
///< planar GBR 4:4:4 27bpp, big-endian
-
AV_PIX_FMT_GBRP9LE,
///< planar GBR 4:4:4 27bpp, little-endian
-
AV_PIX_FMT_GBRP10BE,
///< planar GBR 4:4:4 30bpp, big-endian
-
AV_PIX_FMT_GBRP10LE,
///< planar GBR 4:4:4 30bpp, little-endian
-
AV_PIX_FMT_GBRP16BE,
///< planar GBR 4:4:4 48bpp, big-endian
-
AV_PIX_FMT_GBRP16LE,
///< planar GBR 4:4:4 48bpp, little-endian
-
AV_PIX_FMT_YUVA422P,
///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
-
AV_PIX_FMT_YUVA444P,
///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
-
AV_PIX_FMT_YUVA420P9BE,
///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA420P9LE,
///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA422P9BE,
///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA422P9LE,
///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA444P9BE,
///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
-
AV_PIX_FMT_YUVA444P9LE,
///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
-
AV_PIX_FMT_YUVA420P10BE,
///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA420P10LE,
///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA422P10BE,
///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA422P10LE,
///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA444P10BE,
///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA444P10LE,
///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA420P16BE,
///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA420P16LE,
///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA422P16BE,
///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA422P16LE,
///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
-
AV_PIX_FMT_YUVA444P16BE,
///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
-
AV_PIX_FMT_YUVA444P16LE,
///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
-
-
AV_PIX_FMT_VDPAU,
///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface
-
-
AV_PIX_FMT_XYZ12LE,
///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0
-
AV_PIX_FMT_XYZ12BE,
///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0
-
AV_PIX_FMT_NV16,
///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
-
AV_PIX_FMT_NV20LE,
///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_NV20BE,
///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
-
AV_PIX_FMT_RGBA64BE,
///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
-
AV_PIX_FMT_RGBA64LE,
///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
-
AV_PIX_FMT_BGRA64BE,
///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
-
AV_PIX_FMT_BGRA64LE,
///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
-
-
AV_PIX_FMT_YVYU422,
///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
-
-
AV_PIX_FMT_VDA,
///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef
-
-
AV_PIX_FMT_YA16BE,
///< 16 bits gray, 16 bits alpha (big-endian)
-
AV_PIX_FMT_YA16LE,
///< 16 bits gray, 16 bits alpha (little-endian)
-
-
AV_PIX_FMT_GBRAP,
///< planar GBRA 4:4:4:4 32bpp
-
AV_PIX_FMT_GBRAP16BE,
///< planar GBRA 4:4:4:4 64bpp, big-endian
-
AV_PIX_FMT_GBRAP16LE,
///< planar GBRA 4:4:4:4 64bpp, little-endian
-
/**
-
* HW acceleration through QSV, data[3] contains a pointer to the
-
* mfxFrameSurface1 structure.
-
*/
-
AV_PIX_FMT_QSV,
-
/**
-
* HW acceleration though MMAL, data[3] contains a pointer to the
-
* MMAL_BUFFER_HEADER_T structure.
-
*/
-
AV_PIX_FMT_MMAL,
-
-
AV_PIX_FMT_D3D11VA_VLD,
///< HW decoding through Direct3D11, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer
-
-
/**
-
* HW acceleration through CUDA. data[i] contain CUdeviceptr pointers
-
* exactly as for system memory frames.
-
*/
-
AV_PIX_FMT_CUDA,
-
-
AV_PIX_FMT_0RGB=
0x123+
4,
///< packed RGB 8:8:8, 32bpp, XRGBXRGB… X=unused/undefined
-
AV_PIX_FMT_RGB0,
///< packed RGB 8:8:8, 32bpp, RGBXRGBX… X=unused/undefined
-
AV_PIX_FMT_0BGR,
///< packed BGR 8:8:8, 32bpp, XBGRXBGR… X=unused/undefined
-
AV_PIX_FMT_BGR0,
///< packed BGR 8:8:8, 32bpp, BGRXBGRX… X=unused/undefined
-
-
AV_PIX_FMT_YUV420P12BE,
///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P12LE,
///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV420P14BE,
///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
-
AV_PIX_FMT_YUV420P14LE,
///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-
AV_PIX_FMT_YUV422P12BE,
///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P12LE,
///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV422P14BE,
///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-
AV_PIX_FMT_YUV422P14LE,
///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P12BE,
///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P12LE,
///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_YUV444P14BE,
///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
AV_PIX_FMT_YUV444P14LE,
///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-
AV_PIX_FMT_GBRP12BE,
///< planar GBR 4:4:4 36bpp, big-endian
-
AV_PIX_FMT_GBRP12LE,
///< planar GBR 4:4:4 36bpp, little-endian
-
AV_PIX_FMT_GBRP14BE,
///< planar GBR 4:4:4 42bpp, big-endian
-
AV_PIX_FMT_GBRP14LE,
///< planar GBR 4:4:4 42bpp, little-endian
-
AV_PIX_FMT_YUVJ411P,
///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range
-
-
AV_PIX_FMT_BAYER_BGGR8,
///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_RGGB8,
///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_GBRG8,
///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_GRBG8,
///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */
-
AV_PIX_FMT_BAYER_BGGR16LE,
///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_BGGR16BE,
///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_RGGB16LE,
///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_RGGB16BE,
///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_GBRG16LE,
///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_GBRG16BE,
///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */
-
AV_PIX_FMT_BAYER_GRBG16LE,
///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */
-
AV_PIX_FMT_BAYER_GRBG16BE,
///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */
-
#
if !FF_API_XVMC
-
AV_PIX_FMT_XVMC,
///< XVideo Motion Acceleration via common packet passing
-
#endif
/* !FF_API_XVMC */
-
AV_PIX_FMT_YUV440P10LE,
///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-
AV_PIX_FMT_YUV440P10BE,
///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-
AV_PIX_FMT_YUV440P12LE,
///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-
AV_PIX_FMT_YUV440P12BE,
///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-
AV_PIX_FMT_AYUV64LE,
///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
-
AV_PIX_FMT_AYUV64BE,
///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
-
-
AV_PIX_FMT_VIDEOTOOLBOX,
///< hardware decoding through Videotoolbox
-
-
AV_PIX_FMT_P010LE,
///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian
-
AV_PIX_FMT_P010BE,
///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian
-
-
AV_PIX_FMT_GBRAP12BE,
///< planar GBR 4:4:4:4 48bpp, big-endian
-
AV_PIX_FMT_GBRAP12LE,
///< planar GBR 4:4:4:4 48bpp, little-endian
-
-
AV_PIX_FMT_GBRAP10BE,
///< planar GBR 4:4:4:4 40bpp, big-endian
-
AV_PIX_FMT_GBRAP10LE,
///< planar GBR 4:4:4:4 40bpp, little-endian
-
-
AV_PIX_FMT_MEDIACODEC,
///< hardware decoding through MediaCodec
-
-
AV_PIX_FMT_GRAY12BE,
///< Y , 12bpp, big-endian
-
AV_PIX_FMT_GRAY12LE,
///< Y , 12bpp, little-endian
-
AV_PIX_FMT_GRAY10BE,
///< Y , 10bpp, big-endian
-
AV_PIX_FMT_GRAY10LE,
///< Y , 10bpp, little-endian
-
-
AV_PIX_FMT_P016LE,
///< like NV12, with 16bpp per component, little-endian
-
AV_PIX_FMT_P016BE,
///< like NV12, with 16bpp per component, big-endian
-
-
AV_PIX_FMT_NB
///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
-
};
swscale的用法其实还可以参照swscale-example.c来学习使用,主要用到如下三个函数:
-
av_warn_unused_result
-
int
sws_init_context
(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter);
-
-
/**
-
* Free the swscaler context swsContext.
-
* If swsContext is NULL, then does nothing.
-
*/
-
void sws_freeContext(struct SwsContext *swsContext);
-
-
/**
-
* Allocate and return an SwsContext. You need it to perform
-
* scaling/conversion operations using sws_scale().
-
*
-
* @param srcW the width of the source image
-
* @param srcH the height of the source image
-
* @param srcFormat the source image format
-
* @param dstW the width of the destination image
-
* @param dstH the height of the destination image
-
* @param dstFormat the destination image format
-
* @param flags specify which algorithm and options to use for rescaling
-
* @param param extra parameters to tune the used scaler
-
* For SWS_BICUBIC param[0] and [1] tune the shape of the basis
-
* function, param[0] tunes f(1) and param[1] f´(1)
-
* For SWS_GAUSS param[0] tunes the exponent and thus cutoff
-
* frequency
-
* For SWS_LANCZOS param[0] tunes the width of the window function
-
* @return a pointer to an allocated context, or NULL in case of error
-
* @note this function is to be removed after a saner alternative is
-
* written
-
*/
-
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
-
int dstW, int dstH, enum AVPixelFormat dstFormat,
-
int flags, SwsFilter *srcFilter,
-
SwsFilter *dstFilter, const double *param);
-
/**
-
* Scale the image slice in srcSlice and put the resulting scaled
-
* slice in the image in dst. A slice is a sequence of consecutive
-
* rows in an image.
-
*
-
* Slices have to be provided in sequential order, either in
-
* top-bottom or bottom-top order. If slices are provided in
-
* non-sequential order the behavior of the function is undefined.
-
*
-
* @param c the scaling context previously created with
-
* sws_getContext()
-
* @param srcSlice the array containing the pointers to the planes of
-
* the source slice
-
* @param srcStride the array containing the strides for each plane of
-
* the source image
-
* @param srcSliceY the position in the source image of the slice to
-
* process, that is the number (counted starting from
-
* zero) in the image of the first row of the slice
-
* @param srcSliceH the height of the source slice, that is the number
-
* of rows in the slice
-
* @param dst the array containing the pointers to the planes of
-
* the destination image
-
* @param dstStride the array containing the strides for each plane of
-
* the destination image
-
* @return the height of the output slice
-
*/
-
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
-
const
int srcStride[],
int srcSliceY,
int srcSliceH,
-
uint8_t *
const dst[],
const
int dstStride[]);
当然真正干活的当然是 sws_scale 函数了,具体函数参数可以自行看下具体定义,上面贴的代码里面有,需要注意的是第四个参数srcSliceY 这个代表的是第一列要处理的位置,如果要从头开始处理,直接填0即可,下面有一个完整的栗子,我也会上传到github上面,可以下载。
2. 实例
直接上代码了。。。
-
/*
-
* copyright (c) 2017 老衲不出家
-
*
-
* 2017-08-11
-
*
-
*/
-
-
#include <stdio.h>
-
#include <stdint.h>
-
#include <string.h>
-
-
extern
"C"
-
{
-
#include "libswscale/swscale.h"
-
#include "libavutil/pixfmt.h"
-
}
-
-
const
char *srcFileName =
"ds_480x272.yuv";
-
const
char *dstFileName =
"ds_720x576.yuv";
-
-
int main()
-
{
-
// 設定原始 YUV 的長寬
-
const
int in_width =
480;
-
const
int in_height =
272;
-
-
-
// 設定目的 YUV 的長寬
-
const
int out_width =
720;
-
const
int out_height =
576;
-
-
const
int read_size = in_width * in_height *
3 /
2;
-
const
int write_size = out_width * out_height *
3 /
2;
-
struct SwsContext *img_convert_ctx = nullptr;
-
-
uint8_t *inbuf[
4];
-
uint8_t *outbuf[
4];
-
-
int inlinesize[
4] = { in_width, in_width /
2, in_width /
2,
0 };
-
int outlinesize[
4] = { out_width, out_width /
2, out_width /
2,
0 };
-
-
uint8_t *ptr_src_yuv_buf =
nullptr;
-
uint8_t *ptr_dst_yuv_buf =
nullptr;
-
ptr_src_yuv_buf =
new
uint8_t[in_width * in_height *
3/
2];
-
ptr_dst_yuv_buf =
new
uint8_t[out_width * out_height *
3 /
2];
-
-
FILE *fin = fopen(srcFileName,
"rb");
-
FILE *fout = fopen(dstFileName,
"wb");
-
-
if (fin ==
NULL) {
-
fprintf(
stderr,
"open input file %s error.\n", srcFileName);
-
return
-1;
-
}
-
-
if (fout ==
NULL) {
-
fprintf(
stderr,
"open output file %s error.\n", dstFileName);
-
return
-1;
-
}
-
-
inbuf[
0] = (
uint8_t *)
malloc(in_width*in_height);
-
inbuf[
1] = (
uint8_t *)
malloc(in_width*in_height >>
2);
-
inbuf[
2] = (
uint8_t *)
malloc(in_width*in_height >>
2);
-
inbuf[
3] =
NULL;
-
-
outbuf[
0] = (
uint8_t *)
malloc(out_width*out_height);
-
outbuf[
1] = (
uint8_t *)
malloc(out_width*out_height >>
2);
-
outbuf[
2] = (
uint8_t *)
malloc(out_width*out_height >>
2);
-
outbuf[
3] =
NULL;
-
-
// ********* Initialize software scaling *********
-
// ********* sws_getContext **********************
-
img_convert_ctx = sws_getContext(in_width, in_height, AV_PIX_FMT_YUV420P,
-
out_width, out_height, AV_PIX_FMT_YUV420P, SWS_POINT,
nullptr,
nullptr,
nullptr);
-
if (img_convert_ctx ==
NULL) {
-
fprintf(
stderr,
"Cannot initialize the conversion context!\n");
-
return
-1;
-
}
-
-
int32_t in_y_size = in_width*in_height;
-
int32_t out_y_size;
-
-
bool bExit =
false;
-
while (!bExit) {
-
-
if ((fread(ptr_src_yuv_buf,
1, read_size, fin) <
0) || (feof(fin))) {
-
bExit =
true;
-
break;
-
}
-
-
memcpy(inbuf[
0], ptr_src_yuv_buf, in_y_size);
-
memcpy(inbuf[
1], ptr_src_yuv_buf + in_y_size, in_y_size/
4);
-
memcpy(inbuf[
2], ptr_src_yuv_buf + in_y_size*
5/
4, in_y_size /
4);
-
-
// ********* 主要的 function ******
-
// ********* sws_scale ************
-
sws_scale(img_convert_ctx, inbuf, inlinesize,
-
0, in_height, outbuf, outlinesize);
-
-
memcpy(ptr_dst_yuv_buf, outbuf[
0], out_width*out_height);
-
memcpy(ptr_dst_yuv_buf + out_width*out_height, outbuf[
1], out_width*out_height >>
2);
-
memcpy(ptr_dst_yuv_buf + (out_width*out_height *
5 >>
2), outbuf[
2], out_width*out_height >>
2);
-
-
fwrite(ptr_dst_yuv_buf,
1, write_size, fout);
-
}
-
// ********* 結束的 function *******
-
// ********* sws_freeContext *******
-
sws_freeContext(img_convert_ctx);
-
-
fclose(fin);
-
fclose(fout);
-
-
delete[] ptr_src_yuv_buf;
-
ptr_src_yuv_buf =
nullptr;
-
-
delete[] ptr_dst_yuv_buf;
-
ptr_dst_yuv_buf =
nullptr;
-
-
return
0;
-
}
整体就是输入一个yuv文件,然后放大,当然这个函数还可以进行其他很多操作。
git地址:https://github.com/tanningzhong/ffmpeg-sws_scale
转载自:https://blog.csdn.net/tanningzhong/article/details/77101239