Objective: To install ZM on an rpi3 with mmal support and verify it's using mmal. Evaluate.


Preface:

I tried before to install Devuan directly from IMG provided, and then build ffmpeg with mmal included.
I don't think was necessary as we are not compiling ffmpeg, but instead using libavcodec (I know this now, but 
didn't at the time).

In any case, if you want ZM to have mmal working you must have the libavcodec development headers that include mmal
and you can confirm it by switching debug logging on zmc_m1 (if 1 is your test camera)
But let's cover install steps.

The goal is to:
install raspbian stretch lite
update
install ffmpeg, verify mmal is included

if it does, then install git of zm

compile zm, from a more recent branch that includes the Hardware peripheral calls (HWACCEL)

migrate to devuan (this ended up being required for my setup, as the docker entrypoint.sh doesn't run with zmsystemctl)


it's important to migrate to devuan after installing ffmpeg, as i think the raspbian mirrors are supposed 
to have support for mmal in ffmpeg but the devuan mirrors may not. Devuan pulls from debian, not Raspbian.

Don't bother trying to custom compile ffmpeg, as I mentioned before, you need libavcodec, not ffmpeg. 


OK, now to install ZM from git...

git clone https://github.com/zoneminder/zoneminder.git

also this dockerfile has instructions for building a
ubuntu
img. That might work...
https://github.com/ZoneMinder/zmdockerfiles/blob/master/development/ubuntu/xenial/Dockerfile

the only changes we will make is:
remove libjpeg-turbo8
remove libjpeg-turbo8-dev
remove libmysqlclient-dev
remove libmime-perl
from list

as they are named differently. We'll add them back in later.

also removing the no depends...
so



apt-get update
apt-get dist-upgrade
then

the command I'll run (similar to docker file)
is

  apt-get install -y \
    apache2 \
    build-essential \
    cmake \
    dh-autoreconf \
    dpatch \
    git \
    libapache2-mod-php \
    libarchive-zip-perl \
    libavcodec-dev \
    libavdevice-dev \
    libavfilter-dev \
    libavformat-dev \
    libavresample-dev \
    libav-tools \
    libavutil-dev \
    libbz2-dev \
    libcurl4-gnutls-dev \
    libdate-manip-perl \
    libdbd-mysql-perl \
    libdbi-perl \
    libdevice-serialport-perl \
    libgcrypt-dev \
    libgnutls-openssl-dev \
    libmime-lite-perl \
    libmp4v2-dev \
    libnet-sftp-foreign-perl \
    libnetpbm10-dev \
    libpcre3 \
    libpcre3-dev \
    libpolkit-gobject-1-dev \
    libpostproc-dev \
    libssl-dev \
    libswscale-dev \
    libsys-cpu-perl \
    libsys-meminfo-perl \
    libsys-mmap-perl \
    libtheora-dev \
    libtool \
    libv4l-dev \
    libvlc5 \
    libvlccore8 \
    libvlccore-dev \
    libvlc-dev \
    libvorbis-dev \
    libvpx-dev \
    libwww-perl \
    libx264-dev \
    mysql-client \
    mysql-server \
    php \
    php-cli \
    php-gd \
    php-mysql \
    ssmtp \
    software-properties-common \
    vlc-data \
    yasm \
zip



hopefully that finishes without any errors.
I had dpkg stall halfway through, but that was because I forgot to resize the fs when originally using the Devuan img. 
With the raspbian img, I think it might auto resize the FS.
I reinstalled at that point. easy enough.
and it went through without error.

The four libraries we had to remove
we will now add back in

libturbojpeg0 - TurboJPEG runtime library - SIMD optimized
libturbojpeg0-dev - Development files for the TurboJPEG library
default-libmysqlclient-dev - MySQL database development files (metapackage)
libmariadbclient-dev-compat - MariaDB database development files (libmysqlclient compatibility)

libmime-base32-perl - Base32 encoder/decoder
libmime-base64-urlsafe-perl - Perl version of Python's URL-safe base64 codec
libmime-charset-perl - module for MIME character set information
libmime-encwords-perl - Perl interface to deal with RFC 2047 encoded words
libmime-explode-perl - Perl extension to explode MIME messages
libmime-lite-html-perl - Transform HTML page into MIME email
libmime-lite-perl - module for convenient MIME message creation
libmime-lite-tt-html-perl - module to create HTML mail with MIME::Lite and T
T
libmime-lite-tt-perl - module to generate MIME messages from Template Toolki
t templates
libmime-tools-perl - Perl5 modules for MIME-compliant messages
libmime-types-perl - Perl extension for determining MIME types and Transfer
Encoding
libemail-mime-perl


probably a few extra here we don't need, but regardless...

so

 apt-get install libturbojpeg0 libturbojpeg0-dev default-libmysqlclient-dev \
libmariadbclient-dev-compat libmime-base32-perl libmime-base64-urlsafe-perl \
libmime-charset-perl libmime-encwords-perl libmime-explode-perl libmime-lite-html-perl \
libmime-lite-perl libmime-lite-tt-html-perl libmime-lite-tt-perl libmime-tools-perl \
libmime-types-perl  libemail-mime-perl


then follow the docker guide:
git clone --recursive https://github.com/ZoneMinder/ZoneMinder
cd ZoneMinder

If you want a certain tagged or commit of ZM now's the time to git checkout
e.g. I am doing
git checkout f07b1105d33c088cce4130970ee2f776867f67d0
just so I'm always using the same commit.

then

cmake .

this comes up with a jpeg error...

that is explained here:
in CMakeLists.txt
//
# jpeg
find_package(JPEG)
if(JPEG_FOUND)
        set(HAVE_LIBJPEG 1)
        list(APPEND ZM_BIN_LIBS "${JPEG_LIBRARIES}")
        #link_directories(${JPEG_LIBRARY})
        include_directories("${JPEG_INCLUDE_DIR}")
        set(CMAKE_REQUIRED_INCLUDES "${JPEG_INCLUDE_DIR}")
        check_include_files("stdio.h;jpeglib.h" HAVE_JPEGLIB_H)
        if(NOT HAVE_JPEGLIB_H)
                message(FATAL_ERROR
                    "ZoneMinder requires libjpeg headers - check that libjpeg development
packages are installed")
        endif(NOT HAVE_JPEGLIB_H)
else(JPEG_FOUND)
        message(FATAL_ERROR
            "ZoneMinder requires jpeg but it was not found on your system")
endif(JPEG_FOUND)

//
/usr/lib/aarch64-linux-gnu/





so do this.

apt-get install libjpeg-dev libjpeg62-turbo-dev libjpeg62-turbo libjpeg-turbo-progs


one of those will handle jpeg

NOTE: we might be losing turbo jpeg support, with libjpeg, so beware this is not
optimized for MJPEG... I only plan to use this for RTSP H264 streams, (whole point of this)
so your needs may vary.

# Configure ZoneMinder
RUN cmake .

# Build & install ZoneMinder
RUN make && make install

# ensure writable folders
RUN ./zmlinkcontent.sh

this all worked, no problem. Devuan ascii.

I skipped the volumes part, as we are not using docker.

service mysql stop && service apache2 stop


# Configure Apache
 cp misc/apache.conf /etc/apache2/sites-available/000-default.conf
 echo "ServerName localhost" > /etc/apache2/conf-available/servername.conf && a2enconf -q
servername
 a2enmod -q cgi && a2enmod -q rewrite


This came up with an error for rewite..
//
AH00526: Syntax error on line 62 of /etc/apache2/sites-enabled/000-default.conf:
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in
the server configuration
//

It can be ignored, as we hadn't enabled module rewrite when that loaded.

echo "sql_mode=NO_ENGINE_SUBSTITUTION" >> /etc/mysql/mysql.conf.d/mysqld.cnf


this fails, but you can change /etc/mysql/mysql.conf.d/mysqld.cnf
to
/etc/mysql/my.cnf


We have ZM, but not init scripts. 
Since we are testing, here. Let's just use the dockerfile's entrypoint.sh
That works just as well, as an init script.
wget https://raw.githubusercontent.com/ZoneMinder/zmdockerfiles/master/utils/entrypoint.sh

root@devuan:~# mv entrypoint.sh /usr/local/bin/.
root@devuan:~# chmod 755 /usr/local/bin/entrypoint.sh
root@devuan:~#



now run
/usr/local/bin/entrypoint.sh
I sometimes run it in a screen session
apt-get install screen
# screen
type
ctrl-a :sessionname entrypoint
ctrl-d to disconnect


root@devuan:~# /usr/local/bin/entrypoint.sh

mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
 * Removing stale lock file
 * Starting MySQL database server service   ...done.
 * Warning: Mysql startup timer expired!
mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
 * First run of mysql in the container, creating ZoneMinder dB.
mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION'
 * Starting Apache http web server service   ...done.
 * Starting ZoneMinder video surveillance recorder   ...failed!


//

this fails, but we are close.

The error I had made before was accidentally following the docker exactly. 
It added the 'sql_mode=NO_ENGINE_SUBSTITUTION' to my.cnf
and my.cnf didn't understand it.

So simply comment that out, if you added that by accident.

when you run entrypoint you should see

root@devuan:~# /usr/local/bin/entrypoint.sh

 * Removing stale lock file
 * MySQL database server already running.
 * First run of mysql in the container, creating ZoneMinder dB.
 * Starting Apache http web server service   ...done.
 * Starting ZoneMinder video surveillance recorder   ...done.

And that tells us everything is working.
If you go to ZM at the IP address, you should see it "Running". If you see it stopped, and you still have
raspbian... read below.


NOW, one problem I had is that when I was testing this is raspbian, it tried to call zmsystemctl
which failed to actually run ZM. 

At this point I migrated to Devuan, following the dev1fanboy ascii migration guide (this is what I did)
* add devuan repos to apt/sources
* apt-get install sysvinit-core
* make sure /etc/inittab is there and has init data
* reboot

And then running the entrypoint.sh didn't try to call zmsystemctl, and it worked.

Now follow the next guide for details about my testing with mmal and a camera.
