rendered paste bodytransition_slide(){ TYPE=$1 index=$2 outppm="$WORK_DIR/animenu/$(printf %06d%s $index .ppm)" if [[ $TYPE = "crossfade" ]]; then local VALUE=$(bc -l <<< "scale=2; ($fade_slide + 1) * $fade_incr") >&2 fade_cmd=(composite -blend $VALUE -depth 8 "$overlay_ppm" \ "$base_ppm" "$outppm") elif [[ $TYPE = "fadein" ]]; then local VALUE=$(bc -l <<< "scale=2; $fade_slide * $fade_incr") >&2 fade_cmd=(composite -depth 8 "$base_ppm" "$WORK_DIR/black.ppm" \ -blend ${VALUE}% "$outppm") elif [[ $TYPE = "fadeout" ]]; then local VALUE=$(bc -l <<< "scale=2;100 - (($fade_slide + 1) * $fade_incr)") >&2 (( $(bc <<< "$VALUE < 0") == 1 )) && local VALUE=0 fade_cmd=(composite -depth 8 "$base_ppm" "$WORK_DIR/black.ppm" \ -blend ${VALUE}% "$outppm") fi "${fade_cmd[@]}" >/dev/null}# this function does a loop with transition_slide()do_transitions(){ TYPE=$1 fade_slide=0 for ((i=0; i<=fade_frames; i++)); do transition_slide $TYPE $i #spin "Compositing ${overlay_ppm##*/} over ${base_ppm##*/} with -blend $VALUE" >&2 let fade_slide=fade_slide+1 done if [[ $TYPE = "fadeout" ]] && ((f == ${#MIX_IN[@]}-1)); then for p in {0..12}; do cp "$WORK_DIR/black.ppm" \ "$WORK_DIR/animenu/$(printf %06d%s $((p +i)) .ppm)" >&2 done fi} if [[ $TARGET = "dvd" ]]; then IMGENC_CMD=(ffmpeg -f yuv4mpegpipe -r $FRAME_RATE -i - -s $VIDSIZE \ $SS_FFMOPTS -r $FRAME_RATE -bf 2 -y "$WORK_DIR/slideshow.m2v") else IMGENC_CMD=(ffmpeg -f yuv4mpegpipe -r $FRAME_RATE -i - -nr 500 \ -target ntsc-svcd -f mpeg1video -aspect 4:3 -y "$WORK_DIR/slideshow.m2v") fi # 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 convert -size ${CAROUSEL_SIZE}! xc:'#101010' -depth 8 \ "$WORK_DIR/black.ppm" 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 # encode fadein frames - keep yuv header if [[ $EFFECT = "fade" ]]; then spin "Doing fadein for slide $((f+1))" >&2 # 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 spin "Doing stills for slide $((f+1))" >&2 "${TOYUV_STILLS_CMD[@]}" "${MIX_IN[f]}" 2>/dev/null | $YUVCORRECT 2> /dev/null # now we need yuvcorrect for everything YUVCORRECT="yuvcorrect -T NO_HEADER" # do a transition to the next slide [[ $EFFECT = "fade" ]] && fadetype=fadeout || fadetype="crossfade" spin "Doing $fadetype for slide $((f+1))" >&2 if [[ $EFFECT = "crossfade" ]]; then do_transitions crossfade elif [[ $EFFECT = "fade" ]]; then do_transitions fadeout fi # encode transition frames if (($f == (${#MIX_IN[@]} - 1) )); then fadein_cmd=(ppmtoy4m -v 0 -n 26 -A 10:11 -I p -r -S 420mpeg2) cat "$WORK_DIR"/animenu/*.ppm | "${fadein_cmd[@]}" 2>/dev/null | $YUVCORRECT 2> /dev/null else cat "$WORK_DIR"/animenu/*.ppm | "${TOYUV_FADE_CMD[@]}" 2>/dev/null | $YUVCORRECT 2> /dev/null fi 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 spin "Looping back to slide 1 with crossfade" >&2 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 done > "$WORK_DIR/enc.fifo"