Simplify get_label() and get_frame_id()
[fgen.git] / fgen.sh
diff --git a/fgen.sh b/fgen.sh
index 07507d7..6e66b49 100755 (executable)
--- a/fgen.sh
+++ b/fgen.sh
@@ -9,7 +9,8 @@ set -e
 PROG_NAME=$(basename $0)
 
 # Set default values
-main_layer="Layer 558"
+bg_layer_name="background"
+ref_layer_prefix="ref"
 
 # Pour conversion vidéo:
 fps=8
@@ -17,6 +18,7 @@ fps=8
 debug=0
 trames=1
 SED=sed
+FFMPEG_OPTS="-hide_banner -loglevel error -y"
 
 # -limit memory 5000mb -limit disk 5gb
 IM_OPS=""
@@ -42,45 +44,30 @@ function get_size()
 # 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")
-
-    if [ x"${frame}" = x"" ]; then
-        echo ""
-        return 1
-    else
-        echo "${frame}"
-        return 0
-    fi
+    local token
+    token=$(echo "${1}" | ${SED} "s/.*label:\(.*\),geometry.*/\1/g")
+    echo "${token}"
 }
 
 # Arg1: line
 function get_frame_id()
 {
-    frame=$(echo "${1}" | grep -e "label:[0-9]\+," | ${SED} "s/label:\([0-9]\+\),.*/\1/g")
-
-    if [ x"${frame}" = x"" ]; then
-        echo ""
-    else
-        echo "${frame}"
-    fi
+    frame=$(echo "${1}" | grep -e "label:[0-9]\+," | ${SED} "s/.*label:\([0-9]\+\),.*/\1/g")
+    echo "${frame}"
 }
 
-# Arg1: label
-function is_skip_label()
+# Arg1: line
+function get_scene_id()
 {
-    skip=$(echo "${1}" | grep -e "A8_.*")
-
-    if [ x"${skip}" = x"" ]; then
-        return 1
-    else
-        return 0
-    fi
+    local token
+    token=$(echo "${1}" | ${SED} "s/.*scene:\([0-9]\+\),.*/\1/g")
+    echo "${token}"
 }
 
 print_usage()
@@ -155,54 +142,70 @@ 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 background line:
+    ${SED} -i -e /label:${bg_layer_name},.*/d ${layers}
 
-    # Remove first line (Layer 558):
-    ${SED} -i -e '1d' ${layers}
+    # Remove reference lines:
+    ${SED} -i -e /label:${ref_layer_prefix}.*/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}"
 
-        if is_skip_label "${label}"; then
-            log_dbg "  skip..."
-            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