--- big --- snip ---- IMGENC_CMD=(ffmpeg -f yuv4mpegpipe -r $FRAME_RATE -i - -s $VIDSIZE \ $SS_FFMOPTS $HQ_FLAGS -r $FRAME_RATE -bf 2 $NR -y "$WORK_DIR/slideshow.m2v") # make a fifo to send raw yuv to, to be encoded by ffmpeg mkfifo "$WORK_DIR/enc.fifo" "${IMGENC_CMD[@]}" 2>/dev/null < "$WORK_DIR/enc.fifo" & exec 3> "$WORK_DIR/enc.fifo" if [[ $EFFECT = "fade" ]]; then [[ $TV_STANDARD = "ntsc" ]] && fade_frames=15 || fade_frames=12 fade_incr=$(bc -l <<< "scale=2; 100 / $fade_frames") >&2 elif [[ $EFFECT = "crossfade" ]]; then [[ $TV_STANDARD = "ntsc" ]] && fade_frames=30 || fade_frames=25 fade_incr=$(bc -l <<< "scale=2; 100 / $fade_frames") >&2 fi TOYUV_FADE_CMD=(ppmtoy4m -v 0 -n $fade_frames -A 10:11 -I p -r -S 420mpeg2) TOYUV_STILLS_CMD=(ppmtoy4m -n $MIX_VFRAMES -A 10:11 -I p -S 420mpeg2 -r) # transitions echo >&2 for f in ${!MIX_IN[@]}; do base_ppm="$WORK_DIR/${f}.ppm" if [[ $EFFECT = "crossfade" ]]; then if ((f == (${#MIX_IN[@]} - 1) )); then overlay_ppm="$WORK_DIR/0.ppm" else overlay_ppm="$WORK_DIR/$((f+1)).ppm" fi fi # spin "Encoding and fading ${base_ppm##*/}" >&2 # encode fadein frames - keep yuv header if [[ $EFFECT = "fade" ]]; then # yuvcorrect (remove headers) only if we are not on 1st slide fadein ((f==0)) && YUVCORRECT="cat" do_transitions fadein # encode transition frames cat "$WORK_DIR"/animenu/*.ppm | "${TOYUV_FADE_CMD[@]}" 2>/dev/null | $YUVCORRECT 2>/dev/null rm -f "$WORK_DIR"/animenu/*.ppm fi # encode still frames # need yuvcorrect if for fade style (remove headers) [[ $EFFECT = "fade" ]] && YUVCORRECT="yuvcorrect -T NO_HEADER" if [[ $EFFECT = "crossfade" ]]; then # encoding 1st slide if ((f==0)); then YUVCORRECT="cat" else # subsequent slides and fades need header removed YUVCORRECT="yuvcorrect -T NO_HEADER" fi fi "${TOYUV_STILLS_CMD[@]}" "${MIX_IN[f]}" 2>/dev/null | ${YUVDENOISE[f]} | ${YUVMEDIAN[f]} | $YUVCORRECT 2> /dev/null # now we need yuvcorrect for everything YUVCORRECT="yuvcorrect -T NO_HEADER" # do a transition to the next slide if [[ $EFFECT = "crossfade" ]]; then do_transitions crossfade elif [[ $EFFECT = "fade" ]]; then do_transitions fadeout fi # encode transition frames cat "$WORK_DIR"/animenu/*.ppm | "${TOYUV_FADE_CMD[@]}" 2>/dev/null | $YUVCORRECT 2> /dev/null SS_PID=$! echo "SS_PID is $SS_PID" >&2 rm -f "$WORK_DIR"/animenu/*.ppm # do crossfade looping to 1st slide if doing crossfade effect if (($f == (${#MIX_IN[@]} - 1) )); then if [[ $EFFECT = "crossfade" ]]; then base_ppm=${MIX_IN[0]} do_transitions crossfade # encode transition frames cat "$WORK_DIR"/animenu/*.ppm | "${TOYUV_FADE_CMD[@]}" 2>/dev/null | $YUVCORRECT 2> /dev/null rm -f "$WORK_DIR"/animenu/*.ppm fi fi while kill -0 $SS_PID &>/dev/null; do sleep 0.5 spin "Encoding and fading ${base_ppm##*/} $SPINNER" >&2 done done >&3 # close the pipe exec 3>&- --- big --- snip ---