SED=sed
+F_FMT="%04d"
+
# When reading a file line by line, if a command inside the loop
# also reads stdin, it can exhaust the input file.
# -nostdin: disable ffmpeg interaction on standard input:
;;
esac
+COLOR_ERR="\033[0;31m"
+COLOR_WARN="\033[0;33m"
+COLOR_NONE="\033[0m"
+
+function log_info() {
+ echo -e "${COLOR_NONE}${*}"
+}
+
function log_dbg() {
if [ x"${debug}" = x"1" ]; then
echo "${*}"
fi
}
+function log_warn() {
+ echo -e "${COLOR_WARN}${*}${COLOR_NONE}"
+}
+
+function log_err() {
+ echo -e "${COLOR_ERR}${*}${COLOR_NONE}"
+}
+
# Arg1: layer
function get_size()
{
echo "${token}"
}
+# Generate frame index name with leading zeroes:
+# Arg1: frame number
+function get_frame_name()
+{
+ local index
+
+ index=$(printf "${F_FMT}" ${1})
+ echo "${dest}/${group}-f${index}.png"
+}
+
# Arg1: start frame
# Arg1: end frame
function insert_empty_frames()
local w
local start
local end
+ local wfname
start=${1}
end=${2}
for w in $(seq ${start} ${end}); do
log_dbg "New frame ID: ${w} (empty)"
- cp ${dest}/background.png ${dest}/${group}-f${w}.png
+
+ wfname=$(get_frame_name ${w})
+
+ cp ${dest}/background.png ${wfname}
done
}
function generate_video()
{
+ local png_files
+
if which ffmpeg 1> /dev/null 2>&1; then
- if [ -f ${dest}/${group}-f1.png ]; then
+ set +e
+ png_files=$(ls ${dest}/${group}-f*.png 2> /dev/null)
+ set -e
+
+ if [ x"${png_files}" != x"" ]; then
log_dbg "generate_video start"
if [ ${dry_run} -eq 1 ]; then
touch ${dest}/${group}.mp4
else
- ffmpeg ${FFMPEG_OPTS} -r ${fps} -start_number 1 -i ${dest}/${group}-f%d.png ${dest}/${group}.mp4
+ ffmpeg ${FFMPEG_OPTS} -r ${fps} -pattern_type glob -i "${dest}/${group}-f*.png" ${dest}/${group}.mp4
fi
log_dbg "generate_video: end"
fi
if [ ! -f "${1}" ]; then
- echo "Error: PSD source file not found"
+ log_err "Error: PSD source file not found"
exit 1
fi
log_dbg "Background size: ${size}"
if [ x"${size}" = x"" ]; then
- echo "Error: background layer not found"
+ log_err "Error: background layer not found"
exit 1
fi
nf=""
oldnf=""
files=""
- group=""
+ group="default"
while read l; do
scene=$(get_scene_id "${l}")
fi
group="${ng}"
- log_dbg "New group: ${ng}"
+ log_info "New group: ${ng}"
nf=""
oldnf=""
expected_nf=$((${oldnf} + 1))
if [ ${expected_nf} -ne ${nf} ]; then
- echo "Warning: non-sequential frame sequence: ${nf}"
- echo " previous: ${oldnf}"
- echo " expected: ${expected_nf}"
+ log_warn "Warning: non-sequential frame sequence: ${nf}"
+ log_warn " previous: ${oldnf}"
+ log_warn " expected: ${expected_nf}"
insert_empty_frames ${expected_nf} $((${nf} -1))
fi
fi
log_dbg "New frame ID: ${nf}"
+ fname=$(get_frame_name ${nf})
+
if [ ${dry_run} -eq 1 ]; then
- touch ${dest}/${group}-f${nf}.png
+ touch ${fname}
else
convert -colorspace sRGB -page +0+0 ${dest}/background.png \
${files} -background none -layers merge \
- ${dest}/${group}-f${nf}.png
+ ${fname}
fi
if [ x"${dup_from}" != x"" ]; then
for w in $(seq ${dup_start} ${dup_to}); do
log_dbg "New frame ID: ${w} (duplicate)"
+ wfname=$(get_frame_name ${w})
+
# Use symlink???
- cp ${dest}/${group}-f${nf}.png ${dest}/${group}-f${w}.png
+ cp ${fname} ${wfname}
+
+ nf=${w}
done
fi