1 // This is core/vidl/vidl_ffmpeg_pixel_format.cxx 2 //: 3 // \file 4 // \author Matt Leotta 5 // \author Gehua Yang 6 // \date 19 Jan 2016 7 8 // 9 //----------------------------------------------------------------------------- 10 11 #include <cstring> 12 #include <iostream> 13 #include "vidl_ffmpeg_pixel_format.h" 14 #ifdef _MSC_VER 15 # include "vcl_msvc_warnings.h" 16 #endif 17 18 19 #ifdef LIBAVFORMAT_BUILD 20 # if LIBAVFORMAT_BUILD <= 4623 21 // PIX_FMT_NONE is undefined in old versions of FFMPEG 22 # define PIX_FMT_NONE PixelFormat(-1) 23 # endif 24 #endif 25 26 #if LIBAVCODEC_BUILD >= ((52 << 16) + (10 << 8) + 0) // after ver 52.10.0 27 extern "C" 28 { 29 # include <libswscale/swscale.h> 30 } 31 #endif 32 33 //-------------------------------------------------------------------------------- 34 35 #if LIBAVCODEC_BUILD < ((54 << 16) + (31 << 8) + 0) // before ver 54.31.0 36 37 // The enum values in the old versions have the form PIX_FMT_*, 38 // whereas the new ones are AV_PIX_FMT_*. 39 // Use macro definitions so that the code works on both. 40 # define AV_PIX_FMT_NONE PIX_FMT_NONE 41 # define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P 42 # define AV_PIX_FMT_YUYV422 PIX_FMT_YUYV422 43 # define AV_PIX_FMT_RGB24 PIX_FMT_RGB24 44 # define AV_PIX_FMT_BGR24 PIX_FMT_BGR24 45 # define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P 46 # define AV_PIX_FMT_YUV444P PIX_FMT_YUV444P 47 # define AV_PIX_FMT_YUV410P PIX_FMT_YUV410P 48 # define AV_PIX_FMT_YUV411P PIX_FMT_YUV411P 49 # define AV_PIX_FMT_GRAY8 PIX_FMT_GRAY8 50 # define AV_PIX_FMT_MONOWHITE PIX_FMT_MONOWHITE 51 # define AV_PIX_FMT_MONOBLACK PIX_FMT_MONOBLACK 52 # define AV_PIX_FMT_PAL8 PIX_FMT_PAL8 53 # define AV_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P 54 # define AV_PIX_FMT_YUVJ422P PIX_FMT_YUVJ422P 55 # define AV_PIX_FMT_YUVJ444P PIX_FMT_YUVJ444P 56 57 # define AV_PIX_FMT_UYVY422 PIX_FMT_UYVY422 58 # define AV_PIX_FMT_UYYVYY411 PIX_FMT_UYYVYY411 59 # define AV_PIX_FMT_BGR8 PIX_FMT_BGR8 60 # define AV_PIX_FMT_BGR4 PIX_FMT_BGR4 61 # define AV_PIX_FMT_BGR4_BYTE PIX_FMT_BGR4_BYTE 62 # define AV_PIX_FMT_RGB8 PIX_FMT_RGB8 63 # define AV_PIX_FMT_RGB4 PIX_FMT_RGB4 64 # define AV_PIX_FMT_RGB4_BYTE PIX_FMT_RGB4_BYTE 65 66 # if !defined AV_PIX_FMT_RGB565 67 # define AV_PIX_FMT_RGB565 PIX_FMT_RGB565 68 # endif 69 70 # if !defined AV_PIX_FMT_RGB555 71 # define AV_PIX_FMT_RGB555 PIX_FMT_RGB555 72 # endif 73 74 # define AV_PIX_FMT_NV12 PIX_FMT_NV12 75 # define AV_PIX_FMT_NV21 PIX_FMT_NV21 76 77 # define AV_PIX_FMT_ARGB PIX_FMT_ARGB 78 # define AV_PIX_FMT_RGBA PIX_FMT_RGBA 79 # define AV_PIX_FMT_ABGR PIX_FMT_ABGR 80 # define AV_PIX_FMT_BGRA PIX_FMT_BGRA 81 82 # define AV_PIX_FMT_GRAY16BE PIX_FMT_GRAY16BE 83 # define AV_PIX_FMT_GRAY16LE PIX_FMT_GRAY16LE 84 # define AV_PIX_FMT_YUV440P PIX_FMT_YUV440P 85 # define AV_PIX_FMT_YUVJ440P PIX_FMT_YUVJ440P 86 # define AV_PIX_FMT_YUVA420P PIX_FMT_YUVA420P 87 88 #endif 89 90 91 //: Find the vidl pixel format that matches a FFMPEG one 92 vidl_pixel_format vidl_pixel_format_from_ffmpeg(AVPixelFormat ffmpeg_pix_fmt)93vidl_pixel_format_from_ffmpeg(AVPixelFormat ffmpeg_pix_fmt) 94 { 95 switch (ffmpeg_pix_fmt) 96 { 97 case AV_PIX_FMT_YUV420P: 98 return VIDL_PIXEL_FORMAT_YUV_420P; 99 case AV_PIX_FMT_YUYV422: 100 return VIDL_PIXEL_FORMAT_YUYV_422; 101 case AV_PIX_FMT_RGB24: 102 return VIDL_PIXEL_FORMAT_RGB_24; 103 case AV_PIX_FMT_BGR24: 104 return VIDL_PIXEL_FORMAT_BGR_24; 105 case AV_PIX_FMT_YUV422P: 106 return VIDL_PIXEL_FORMAT_YUV_422P; 107 case AV_PIX_FMT_YUV444P: 108 return VIDL_PIXEL_FORMAT_YUV_444P; 109 #ifdef AV_PIX_FMT_RGBA 110 case AV_PIX_FMT_RGBA: 111 return VIDL_PIXEL_FORMAT_RGBA_32; 112 #endif 113 case AV_PIX_FMT_YUV410P: 114 return VIDL_PIXEL_FORMAT_YUV_410P; 115 case AV_PIX_FMT_YUV411P: 116 return VIDL_PIXEL_FORMAT_YUV_411P; 117 case AV_PIX_FMT_RGB565: 118 return VIDL_PIXEL_FORMAT_RGB_565; 119 case AV_PIX_FMT_RGB555: 120 return VIDL_PIXEL_FORMAT_RGB_555; 121 case AV_PIX_FMT_GRAY8: 122 return VIDL_PIXEL_FORMAT_MONO_8; 123 case AV_PIX_FMT_PAL8: 124 return VIDL_PIXEL_FORMAT_MONO_8; // HACK: Treating 8-bit palette as greyscale image 125 case AV_PIX_FMT_MONOWHITE: 126 return VIDL_PIXEL_FORMAT_MONO_1; 127 case AV_PIX_FMT_MONOBLACK: 128 return VIDL_PIXEL_FORMAT_MONO_1; 129 case AV_PIX_FMT_UYVY422: 130 return VIDL_PIXEL_FORMAT_UYVY_422; 131 case AV_PIX_FMT_UYYVYY411: 132 return VIDL_PIXEL_FORMAT_UYVY_411; 133 default: 134 break; 135 } 136 return VIDL_PIXEL_FORMAT_UNKNOWN; 137 } 138 139 140 //: Find the FFMPEG pixel format that matches a vidl one 141 AVPixelFormat vidl_pixel_format_to_ffmpeg(vidl_pixel_format vidl_pix_fmt)142vidl_pixel_format_to_ffmpeg(vidl_pixel_format vidl_pix_fmt) 143 { 144 switch (vidl_pix_fmt) 145 { 146 case VIDL_PIXEL_FORMAT_RGB_24: 147 return AV_PIX_FMT_RGB24; 148 case VIDL_PIXEL_FORMAT_BGR_24: 149 return AV_PIX_FMT_BGR24; 150 #ifdef AV_PIX_FMT_RGBA 151 case VIDL_PIXEL_FORMAT_RGBA_32: 152 return AV_PIX_FMT_RGBA; 153 #endif 154 case VIDL_PIXEL_FORMAT_RGB_565: 155 return AV_PIX_FMT_RGB565; 156 case VIDL_PIXEL_FORMAT_RGB_555: 157 return AV_PIX_FMT_RGB555; 158 case VIDL_PIXEL_FORMAT_YUV_444P: 159 return AV_PIX_FMT_YUV444P; 160 case VIDL_PIXEL_FORMAT_YUYV_422: 161 return AV_PIX_FMT_YUYV422; 162 case VIDL_PIXEL_FORMAT_YUV_422P: 163 return AV_PIX_FMT_YUV422P; 164 case VIDL_PIXEL_FORMAT_YUV_420P: 165 return AV_PIX_FMT_YUV420P; 166 case VIDL_PIXEL_FORMAT_YUV_411P: 167 return AV_PIX_FMT_YUV411P; 168 case VIDL_PIXEL_FORMAT_YUV_410P: 169 return AV_PIX_FMT_YUV410P; 170 case VIDL_PIXEL_FORMAT_UYVY_422: 171 return AV_PIX_FMT_UYVY422; 172 case VIDL_PIXEL_FORMAT_UYVY_411: 173 return AV_PIX_FMT_UYYVYY411; 174 case VIDL_PIXEL_FORMAT_MONO_1: 175 return AV_PIX_FMT_MONOBLACK; 176 case VIDL_PIXEL_FORMAT_MONO_8: 177 return AV_PIX_FMT_GRAY8; 178 default: 179 break; 180 } 181 std::cerr << "Warning: unknown FFMPeg pixel format type : " << vidl_pix_fmt << '\n'; 182 return AV_PIX_FMT_NONE; 183 } 184