All pastes #941846 Raw Edit

Miscellany

public shellscript v1 · immutable
·published 2008-03-14 00:06 UTC
rendered paste body
transition_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"