0

So I'm following this post on how to install openCV for Python 3. And I'm running into some issues at the compile process. Running the make -j4 command goes fine up until it's 28% through when I get this error message: error: use of undeclared identifier 'avcodec_free_frame'; did you mean 'avcodec_get_name'?

I don't even know where to start to solve this issue. I've got ffmpeg installed through brew.

Complete list of commands:

cd ~
git clone https://github.com/Itseez/opencv.git
cd opencv
git checkout 3.0.0
cd ~
git clone https://github.com/Itseez/opencv_contrib.git
cd opencv_contrib
git checkout 3.0.0
cd ~/opencv
mkdir build
cd build
cmake CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D PYTHON3_LIBRARY=/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/config-3.5m/libpython3.5.dylib \
    -D PYTHON3_INCLUDE_DIR=/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m/ \
    -D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
    -D BUILD_opencv_python2=OFF \
    -D BUILD_opencv_python3=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D BUILD_EXAMPLES=ON .. \
    -D FFMPEG_INCLUDE_DIR=/usr/local/Cellar/ffmpeg/3.3.4/include/
    -D FFMPEG_LIB_DIR=/usr/local/Cellar/ffmpeg/3.3.4/lib/
    -D WITH_FFMPEG=ON
cmake
make -j4

I got the FFMPEG_INCLUDE_DIR, FFMPEG_LIB_DIR and WITH_FFMPEG from this post: http://blog.jiashen.me/2014/12/23/build-opencv-3-on-mac-os-x-with-python-3-and-ffmpeg-support/

The full error log:

[ 28%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_qtkit.mm.o
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:317:9: error: use of undeclared identifier
      'avcodec_free_frame'; did you mean 'avcodec_get_name'?
        avcodec_free_frame(&picture);
        ^~~~~~~~~~~~~~~~~~
        avcodec_get_name
/usr/local/Cellar/ffmpeg/3.3.4/include/libavcodec/avcodec.h:6289:13: note: 'avcodec_get_name' declared here
const char *avcodec_get_name(enum AVCodecID id);
            ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:317:28: error: cannot initialize a parameter of type
      'enum AVCodecID' with an rvalue of type 'AVFrame **'
        avcodec_free_frame(&picture);
                           ^~~~~~~~
/usr/local/Cellar/ffmpeg/3.3.4/include/libavcodec/avcodec.h:6289:45: note: passing argument to parameter 'id' here
const char *avcodec_get_name(enum AVCodecID id);
                                            ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:632:23: error: use of undeclared identifier
      'avcodec_alloc_frame'
            picture = avcodec_alloc_frame();
                      ^
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:635:41: error: use of undeclared identifier
      'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'?
                    avpicture_get_size( PIX_FMT_BGR24,
                                        ^~~~~~~~~~~~~
                                        AV_PIX_FMT_BGR24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here
    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:638:29: error: use of undeclared identifier
      'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'?
                            PIX_FMT_BGR24, enc->width, enc->height );
                            ^~~~~~~~~~~~~
                            AV_PIX_FMT_BGR24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here
    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:738:67: error: use of undeclared identifier
      'PIX_FMT_RGB24'; did you mean 'AV_PIX_FMT_RGB24'?
    avpicture_fill((AVPicture*)&rgb_picture, rgb_picture.data[0], PIX_FMT_RGB24,
                                                                  ^~~~~~~~~~~~~
                                                                  AV_PIX_FMT_RGB24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:64:5: note: 'AV_PIX_FMT_RGB24' declared here
    AV_PIX_FMT_RGB24,     ///< packed RGB 8:8:8, 24bpp, RGBRGB...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:756:17: error: use of undeclared identifier
      'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'?
                PIX_FMT_BGR24,
                ^~~~~~~~~~~~~
                AV_PIX_FMT_BGR24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here
    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1110:15: error: use of undeclared identifier
      'avcodec_alloc_frame'
    picture = avcodec_alloc_frame();
              ^
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1113:33: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
    size = avpicture_get_size( (PixelFormat) pix_fmt, width, height);
                                ^~~~~~~~~~~
                                AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1122:25: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
                       (PixelFormat) pix_fmt, width, height);
                        ^~~~~~~~~~~
                        AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1230:19: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
    c->pix_fmt = (PixelFormat) pixel_format;
                  ^~~~~~~~~~~
                  AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1405:26: error: use of undeclared identifier
      'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'?
    if (input_pix_fmt == PIX_FMT_BGR24) {
                         ^~~~~~~~~~~~~
                         AV_PIX_FMT_BGR24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here
    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1410:31: error: use of undeclared identifier
      'PIX_FMT_GRAY8'; did you mean 'AV_PIX_FMT_GRAY8'?
    else if (input_pix_fmt == PIX_FMT_GRAY8) {
                              ^~~~~~~~~~~~~
                              AV_PIX_FMT_GRAY8
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:70:5: note: 'AV_PIX_FMT_GRAY8' declared here
    AV_PIX_FMT_GRAY8,     ///<        Y        ,  8bpp
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1423:25: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
                       (PixelFormat)input_pix_fmt, width, height);
                        ^~~~~~~~~~~
                        AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1429:47: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
                                             (PixelFormat)input_pix_fmt,
                                              ^~~~~~~~~~~
                                              AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1447:25: error: unknown type name 'PixelFormat'; did you
      mean 'AVPixelFormat'?
                       (PixelFormat)input_pix_fmt, width, height);
                        ^~~~~~~~~~~
                        AVPixelFormat
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here
enum AVPixelFormat {
     ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1604:25: error: use of undeclared identifier
      'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'?
        input_pix_fmt = PIX_FMT_BGR24;
                        ^~~~~~~~~~~~~
                        AV_PIX_FMT_BGR24
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here
    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1607:25: error: use of undeclared identifier
      'PIX_FMT_GRAY8'; did you mean 'AV_PIX_FMT_GRAY8'?
        input_pix_fmt = PIX_FMT_GRAY8;
                        ^~~~~~~~~~~~~
                        AV_PIX_FMT_GRAY8
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:70:5: note: 'AV_PIX_FMT_GRAY8' declared here
    AV_PIX_FMT_GRAY8,     ///<        Y        ,  8bpp
    ^
In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45:
/Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1683:25: error: use of undeclared identifier
      'PIX_FMT_YUV422P'; did you mean 'AV_PIX_FMT_YUV422P'?
        codec_pix_fmt = PIX_FMT_YUV422P;
                        ^~~~~~~~~~~~~~~
                        AV_PIX_FMT_YUV422P
/usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:66:5: note: 'AV_PIX_FMT_YUV422P' declared here
    AV_PIX_FMT_YUV422P,   ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
    ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
/Users/myuser/opencv/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
        ^
1 error generated.
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_qtkit.mm.o] Error 1
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
make: *** [all] Error 2

This question on openCV's website seems to adress the same issue but there is no solution posted: http://answers.opencv.org/question/90091/error-use-of-undeclared-identifier-avcodec_free_frame-did-you-mean-avcodec_get_name/

bork
  • 1,556
  • 4
  • 21
  • 42

2 Answers2

2

avcodec_free_frame, PixelFormat and PIX_FMT_xxx are deprecated in ffmpeg long ago. I'm pretty sure they don't even exist in 3.3.4 or current master branch.

So the opencv version you checked out must be too old to built with ffmpeg 3.3.4, and maybe only compatible with ffmpeg 2 series.

Opencv has updated ffmpeg compatibility in recent commits, like this. You can see the conditional macro to fit different ffmpeg API, the newer av_frame_free and older avcodec_frame_free.

halfelf
  • 9,737
  • 13
  • 54
  • 63
  • Thanks for your answer! I checkout out the master branch in opencv and built it from there, worked better, I got passed the errors I had in my OP, but now I'm facing this error instead: `/Users/myuser/opencv_contrib/modules/optflow/src/motempl.cpp:56:47: error: no member named 'video' in namespace 'cv::ocl' ocl::Kernel k("updateMotionHistory", ocl::video::updatemotionhistory_oclsrc); ` – bork Sep 12 '17 at 08:53
  • @bork have u updated the contrib repo? There is no such line in master branch. – halfelf Sep 12 '17 at 09:57
  • It was resolved when I cleared the Cmake cache. Going to mark this as the answer as it solved the specific issue I posted about! – bork Sep 12 '17 at 10:04
1

From the error log, it looks like you have ffmpeg version 3.3.3 while you forced cmake to look for version 3.3.4 headers and libraries. You should clear CMake cache and let it detect ffmpeg automatically. Or you can do brew upgrade ffmpeg to upgrade your ffmpeg to 3.3.4.

Also, I'd suggest using the lastest version of CMake GUI here.

Quang Hoang
  • 146,074
  • 10
  • 56
  • 74