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)93 vidl_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)142 vidl_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