#!/bin/bash -ex
# Eval 1 Builder PB, 2026-10-05: OpenCV 4.11.0 FFmpeg plugin (opencv_videoio_ffmpeg_64.dll) with FFmpeg n7.1,
# LGPL only (no --enable-gpl, no x264/x265, no external codec libraries), x86 SIMD off (--disable-x86asm --disable-inline-asm).
# Adapted from opencv_3rdparty ffmpeg/4.x_20260715_src (commit 33d5aa90): make_mingw.sh + build_videoio_plugin.sh.
# Differences from OpenCV's official script: no libopenh264/libvpx/libaom (sources not in the approved download list;
# FFmpeg's own native decoders are used for H.264/VP8/VP9), --disable-x86asm --disable-inline-asm, and
# --disable-zlib/bzlib/lzma/iconv so nothing outside FFmpeg is linked; x86_64 only; paths under /root/eval1/PB.
# Inputs (sha256 recorded in PROGRESS.md): ffmpeg-n7.1-b08d7969.tar.xz, opencv-4.11.0-31b0eeea.tar.xz, o3p/ (scripts).
W=/root/eval1/PB
B=$W/build
CPU_COUNT=${CPU_COUNT:-32}
mkdir -p $B
cd $B
[ -d ffmpeg ] || { mkdir ffmpeg && tar -xJf $W/ffmpeg-n7.1-b08d7969.tar.xz -C ffmpeg --strip-components=1; }
[ -d opencv ] || { mkdir opencv && tar -xJf $W/opencv-4.11.0-31b0eeea.tar.xz -C opencv --strip-components=1; }

FFMPEG_CONFIGURE_OPTIONS="--pkg-config=pkg-config --enable-static --enable-w32threads --disable-filters --disable-bsfs --disable-programs --disable-debug --disable-cuda --disable-cuvid --disable-nvenc --disable-x86asm --disable-inline-asm --disable-zlib --disable-bzlib --disable-lzma --disable-iconv"
rm -rf $B/ffmpeg_x86_64
mkdir -p $B/ffmpeg_x86_64
(
 cd $B/ffmpeg_x86_64
 ../ffmpeg/configure --enable-cross-compile --arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- ${FFMPEG_CONFIGURE_OPTIONS} --prefix=$B/ffmpeg_x86_64/install
 make -j${CPU_COUNT} install
)
grep -E "^(HAVE_X86ASM|HAVE_INLINE_ASM|HAVE_SSE2|HAVE_SSSE3|HAVE_AVX2|CONFIG_GPL|CONFIG_VERSION3|CONFIG_NONFREE)[= ]" $B/ffmpeg_x86_64/ffbuild/config.mak || true
grep -E "#define (HAVE_X86ASM|HAVE_INLINE_ASM|HAVE_MMX_INLINE|HAVE_SSE2_EXTERNAL|HAVE_SSSE3_EXTERNAL|HAVE_AVX2_EXTERNAL|CONFIG_GPL|CONFIG_VERSION3|CONFIG_NONFREE) " $B/ffmpeg_x86_64/config.h

sed "s#/build/#$B/#" $W/o3p/mingw-toolchain-x86_64.cmake > $W/mingw-toolchain-x86_64.cmake

OPENCV_CMAKE_ARGS=(
  -DCMAKE_BUILD_TYPE=Release
  -DBUILD_SHARED_LIBS=OFF
  -DCPU_DISPATCH=
  "-DOPENCV_EXTRA_FLAGS=-DCV_EXPORTS= -D_GNU_SOURCE="
  -DWITH_PTHREADS_PF=OFF
  -DWITH_IPP=OFF -DWITH_ADE=OFF -DWITH_LAPACK=OFF -DWITH_OPENCL=OFF -DWITH_DIRECTX=OFF -DWITH_WIN32UI=OFF
  -DWITH_EIGEN=OFF -DWITH_JPEG=OFF -DWITH_WEBP=OFF -DWITH_JASPER=OFF -DWITH_OPENJPEG=OFF -DWITH_OPENEXR=OFF -DWITH_PNG=OFF -DWITH_TIFF=OFF
  -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_DSHOW=OFF -DWITH_1394=OFF
  -DWITH_PROTOBUF=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_PFM=OFF
  -DWITH_ITT=OFF -DCV_TRACE=OFF
  -DBUILD_LIST=core,imgproc,videoio
  -DOPENCV_CORE_EXCLUDE_C_API=1
)
rm -rf $B/opencv_x86_64; mkdir -p $B/opencv_x86_64
( cd $B/opencv_x86_64
  cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=$W/mingw-toolchain-x86_64.cmake "${OPENCV_CMAKE_ARGS[@]}" $B/opencv
  ninja opencv_modules -j${CPU_COUNT} )

DST_DIR=$W/out
mkdir -p $DST_DIR
rm -rf $B/opencv_ffmpeg_plugin_x86_64; mkdir -p $B/opencv_ffmpeg_plugin_x86_64
( cd $B/opencv_ffmpeg_plugin_x86_64
  PKG_CONFIG_PATH=$B/ffmpeg_x86_64/install/lib/pkgconfig \
  RCFLAGS=-DFFMPEG_INTERNAL_NAME=opencv_videoio_ffmpeg_64 \
  cmake -GNinja \
      -DCMAKE_TOOLCHAIN_FILE=$W/mingw-toolchain-x86_64.cmake \
      -DOpenCV_DIR=$B/opencv_x86_64 \
      "-DCMAKE_MODULE_LINKER_FLAGS=-static -lbcrypt -static-libgcc -static-libstdc++ -Wl,--gc-sections -Wl,-Bsymbolic" \
      -DCMAKE_BUILD_TYPE=Release \
      -DOPENCV_PLUGIN_MODULE_PREFIX= \
      -DOPENCV_FFMPEG_SKIP_DOWNLOAD=ON \
      -DCMAKE_INSTALL_PREFIX=$DST_DIR \
      $B/opencv/modules/videoio/misc/plugin_ffmpeg \
      "-DOPENCV_PLUGIN_EXTRA_SRC_FILES=$W/o3p/opencv_ffmpeg.rc" \
      "-DOPENCV_PLUGIN_VERSION="
  ninja -v
  ninja install/strip
  strings ./opencv_videoio_ffmpeg_64.dll | grep '/src/' | grep opencv | uniq || true )
ls -la $DST_DIR
x86_64-w64-mingw32-objdump -p $DST_DIR/opencv_videoio_ffmpeg_64.dll | grep -E "DLL Name|^\s+\[" | head -60 || true
sha256sum $DST_DIR/opencv_videoio_ffmpeg_64.dll
