PROG_NAME=$(basename $0)
# Set default values
-main_layer="Layer 558"
+bg_layer_name="background"
# Pour conversion vidéo:
fps=8
debug=0
trames=1
SED=sed
+FFMPEG_OPTS="-hide_banner -loglevel error -y"
# -limit memory 5000mb -limit disk 5gb
IM_OPS=""
# Arg1: layer
function get_size()
{
- cat ${layers} | grep "${1}" | ${SED} "s/.*geometry:\([0-9]\+x[0-9]\+\).*/\1/g"
+ cat ${layers} | grep -m 1 "${1}" | ${SED} "s/.*geometry:\([0-9]\+x[0-9]\+\).*/\1/g"
}
# Arg1: layer
function get_pos()
{
- cat ${layers} | grep "${1}" | ${SED} "s/.*geometry:[0-9]\+x[0-9]\+\(+[0-9]\+[0-9]\+\)/\1/g"
+ cat ${layers} | grep "${1}" | ${SED} "s/.*geometry:[0-9]\+x[0-9]\+\(+[0-9]\++[0-9]\+\),.*/\1/g"
}
# Arg1: line
function get_label()
{
- frame=$(echo "${1}" | grep -e "label:.*," | ${SED} "s/label:\(.*\),.*/\1/g")
+ frame=$(echo "${1}" | ${SED} "s/.*label:\(.*\),geometry.*/\1/g")
if [ x"${frame}" = x"" ]; then
echo ""
# Arg1: line
function get_frame_id()
{
- frame=$(echo "${1}" | grep -e "label:[0-9]" | ${SED} "s/label:\([0-9]\+\),.*/\1/g")
+ frame=$(echo "${1}" | grep -e "label:[0-9]\+," | ${SED} "s/.*label:\([0-9]\+\),.*/\1/g")
if [ x"${frame}" = x"" ]; then
echo ""
fi
}
+# Arg1: line
+function get_scene_id()
+{
+ local token
+ token=$(echo "${1}" | ${SED} "s/.*scene:\([0-9]\+\),.*/\1/g")
+ echo "${token}"
+}
+
# Arg1: label
function is_skip_label()
{
if [ ! -d ${dest} ]; then
mkdir ${dest}
- # rm -rf ${dest}
fi
for tool in convert composite identify; do
done
if [ ${trames} -eq 1 ]; then
- identify ${IM_OPS} -verbose -format "label:%l,geometry:%g\n" ${src} > ${layers}
+ # %s: scene number
+ identify ${IM_OPS} -verbose -format "scene:%s,label:%l,geometry:%g,\n" ${src} > ${layers}
- # Ignore empty labels:
+ # Remove line(s) with empty label:
${SED} -i -e /label:,.*/d ${layers}
# Extract global frame size:
- size=$(get_size "${main_layer}")
+ size=$(get_size "${bg_layer_name}")
- log_dbg "CANVAS SIZE=${size}"
+ log_dbg "Background size: ${size}"
- # Create background frame:
- convert -size ${size} xc:none ${dest}/background.png
+ if [ x"${size}" = x"" ]; then
+ echo "Error: background layer not found"
+ exit 1
+ fi
- # Remove first line (Layer 558):
- ${SED} -i -e '1d' ${layers}
+ # Remove background line:
+ ${SED} -i -e /label:${bg_layer_name},.*/d ${layers}
- # Will start at frame 2 at first loop iteration
- f=1
+ # Create background frame:
+ convert -size ${size} xc:none ${dest}/background.png
+ nf=""
+ oldnf=""
files=""
while read l; do
- f=$((${f} + 1))
-
+ scene=$(get_scene_id "${l}")
label=$(get_label "${l}")
p=$(get_pos "${l}")
nf=$(get_frame_id "${l}")
- log_dbg "Couche ${f}"
+ log_dbg "Layer ${scene}"
log_dbg " nom: ${label}"
log_dbg " pos: ${p}"
continue
fi
- files="${files} -page ${p} ${src}[${f}]"
+ files="${files} -page ${p} ${src}[${scene}]"
if [ x"${nf}" != x"" ]; then
+ # Only check expected frame if oldnf is set...
+ if [ x"${oldnf}" != x"" ]; then
+ expected_nf=$((${oldnf} + 1))
+
+ if [ ${expected_nf} -ne ${nf} ]; then
+ echo "Error: invalid frame sequence: ${nf}"
+ echo " previous: ${oldnf}"
+ echo " expected: ${expected_nf}"
+ files=""
+ continue
+ fi
+ fi
+
log_dbg "New frame ID: ${nf}"
convert -colorspace sRGB -page +0+0 ${dest}/background.png ${files} -background none -layers merge ${dest}/f${nf}.png
files=""
+ oldnf="${nf}"
fi
done <${layers}
fi
if which ffmpeg 1> /dev/null 2>&1; then
# Conversion vidéo:
- ffmpeg -y -r ${fps} -start_number 1 -i ${dest}/f%d.png ${dest}/sequence.mp4
+ ffmpeg ${FFMPEG_OPTS} -r ${fps} -start_number 1 -i ${dest}/f%d.png ${dest}/sequence.mp4
fi