contrib/brl/bbas/vidl2/vidl2_ffmpeg_convert.cxx

Go to the documentation of this file.
00001 // This is brl/bbas/vidl2/vidl2_ffmpeg_convert.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 // \file
00007 // \author Matt Leotta
00008 // \date   19 Jan 2006
00009 //
00010 //-----------------------------------------------------------------------------
00011 
00012 #include "vidl2_ffmpeg_convert.h"
00013 #include "vidl2_frame.h"
00014 #include <vcl_cstring.h>
00015 
00016 
00017 #if LIBAVFORMAT_BUILD <= 4623
00018 // PIX_FMT_NONE is undefined in old versions of FFMPEG
00019 #define PIX_FMT_NONE PixelFormat(-1)
00020 #endif
00021 
00022 
00023 //--------------------------------------------------------------------------------
00024 
00025 //: Convert the pixel format of a frame using FFMPEG
00026 //
00027 // The \p in_frame->data() is converted from \p in_frame->pixel_format()
00028 // to \p out_frame->pixel_format() and stored in \p out_frame->data()
00029 // If the output frame data is not the correct size new memory
00030 // will be allocated
00031 bool vidl2_ffmpeg_convert(const vidl2_frame_sptr& in_frame,
00032                                 vidl2_frame_sptr& out_frame)
00033 {
00034   if (!in_frame || !out_frame)
00035     return false;
00036 
00037   PixelFormat in_fmt =
00038       vidl2_pixel_format_to_ffmpeg(in_frame->pixel_format());
00039 
00040   PixelFormat out_fmt =
00041       vidl2_pixel_format_to_ffmpeg(out_frame->pixel_format());
00042 
00043   if (in_fmt == PIX_FMT_NONE || out_fmt == PIX_FMT_NONE)
00044     return false;
00045 
00046   unsigned ni = in_frame->ni();
00047   unsigned nj = in_frame->nj();
00048   unsigned out_size = (unsigned) avpicture_get_size( out_fmt, ni, nj );
00049 
00050   if (out_frame->size() != out_size ||
00051       out_frame->ni() != ni ||
00052       out_frame->nj() != nj ||
00053       !out_frame->data() )
00054     out_frame = new vidl2_memory_chunk_frame(ni, nj, out_frame->pixel_format(),
00055                                              new vil_memory_chunk(out_size, VIL_PIXEL_FORMAT_BYTE));
00056 
00057   AVPicture in_pic;
00058   vcl_memset( &in_pic, 0, sizeof(in_pic) );
00059   avpicture_fill(&in_pic, (uint8_t*) in_frame->data(), in_fmt, ni, nj);
00060 
00061   AVPicture out_pic;
00062   vcl_memset( &out_pic, 0, sizeof(out_pic) );
00063   avpicture_fill(&out_pic, (uint8_t*) out_frame->data(), out_fmt, ni, nj);
00064 
00065 
00066   if ( img_convert( &out_pic, out_fmt, &in_pic, in_fmt, ni, nj ) < 0 )
00067     return false;
00068 
00069   return true;
00070 }
00071 
00072 
00073 //: Find the vidl2 pixel format that matches a FFMPEG one
00074 vidl2_pixel_format
00075 vidl2_pixel_format_from_ffmpeg(PixelFormat ffmpeg_pix_fmt)
00076 {
00077   switch (ffmpeg_pix_fmt)
00078   {
00079     case PIX_FMT_YUV420P:   return VIDL2_PIXEL_FORMAT_YUV_420P;
00080     case PIX_FMT_YUV422:    return VIDL2_PIXEL_FORMAT_YUYV_422;
00081     case PIX_FMT_RGB24:     return VIDL2_PIXEL_FORMAT_RGB_24;
00082     case PIX_FMT_BGR24:     return VIDL2_PIXEL_FORMAT_BGR_24;
00083     case PIX_FMT_YUV422P:   return VIDL2_PIXEL_FORMAT_YUV_422P;
00084     case PIX_FMT_YUV444P:   return VIDL2_PIXEL_FORMAT_YUV_444P;
00085     case PIX_FMT_RGBA32:    return VIDL2_PIXEL_FORMAT_RGBA_32;
00086     case PIX_FMT_YUV410P:   return VIDL2_PIXEL_FORMAT_YUV_410P;
00087     case PIX_FMT_YUV411P:   return VIDL2_PIXEL_FORMAT_YUV_411P;
00088     case PIX_FMT_RGB565:    return VIDL2_PIXEL_FORMAT_RGB_565;
00089     case PIX_FMT_RGB555:    return VIDL2_PIXEL_FORMAT_RGB_555;
00090     case PIX_FMT_GRAY8:     return VIDL2_PIXEL_FORMAT_MONO_8;
00091     case PIX_FMT_MONOWHITE: return VIDL2_PIXEL_FORMAT_MONO_1;
00092     case PIX_FMT_MONOBLACK: return VIDL2_PIXEL_FORMAT_MONO_1;
00093 // Some libffmpeg distribs (notably Mandriva's) don't include these two:
00094 #ifdef PIX_FMT_UYVY422
00095     case PIX_FMT_UYVY422:   return VIDL2_PIXEL_FORMAT_UYVY_422;
00096 #endif
00097 #ifdef PIX_FMT_UYVY411
00098     case PIX_FMT_UYVY411:   return VIDL2_PIXEL_FORMAT_UYVY_411;
00099 #endif
00100     default: break;
00101   }
00102   return VIDL2_PIXEL_FORMAT_UNKNOWN;
00103 }
00104 
00105 
00106 //: Find the FFMPEG pixel format that matches a vidl2 one
00107 PixelFormat
00108 vidl2_pixel_format_to_ffmpeg(vidl2_pixel_format vidl2_pix_fmt)
00109 {
00110   switch (vidl2_pix_fmt)
00111   {
00112     case VIDL2_PIXEL_FORMAT_RGB_24:   return PIX_FMT_RGB24;
00113     case VIDL2_PIXEL_FORMAT_BGR_24:   return PIX_FMT_BGR24;
00114     case VIDL2_PIXEL_FORMAT_RGBA_32:  return PIX_FMT_RGBA32;
00115     case VIDL2_PIXEL_FORMAT_RGB_565:  return PIX_FMT_RGB565;
00116     case VIDL2_PIXEL_FORMAT_RGB_555:  return PIX_FMT_RGB555;
00117     case VIDL2_PIXEL_FORMAT_YUV_444P: return PIX_FMT_YUV444P;
00118     case VIDL2_PIXEL_FORMAT_YUYV_422: return PIX_FMT_YUV422;
00119     case VIDL2_PIXEL_FORMAT_YUV_422P: return PIX_FMT_YUV422P;
00120     case VIDL2_PIXEL_FORMAT_YUV_420P: return PIX_FMT_YUV420P;
00121     case VIDL2_PIXEL_FORMAT_YUV_411P: return PIX_FMT_YUV411P;
00122     case VIDL2_PIXEL_FORMAT_YUV_410P: return PIX_FMT_YUV410P;
00123 // Some libffmpeg distribs (notably Mandriva's) don't include these two:
00124 #ifdef PIX_FMT_UYVY422
00125     case VIDL2_PIXEL_FORMAT_UYVY_422: return PIX_FMT_UYVY422;
00126 #endif
00127 #ifdef PIX_FMT_UYVY411
00128     case VIDL2_PIXEL_FORMAT_UYVY_411: return PIX_FMT_UYVY411;
00129 #endif
00130     case VIDL2_PIXEL_FORMAT_MONO_1:   return PIX_FMT_MONOBLACK;
00131     case VIDL2_PIXEL_FORMAT_MONO_8:   return PIX_FMT_GRAY8;
00132     default: break;
00133   }
00134   return PIX_FMT_NONE;
00135 }

Generated on Wed Dec 3 05:21:03 2008 for contrib/brl/bbas/vidl2 by  doxygen 1.5.1