@@ -3033,75 +3033,205 @@ $val" ;;
30333033}
30343034
30353035# Applies media configuration (format and links) using media-ctl from parsed pipeline block.
3036- # Resets media graph first and applies user-specified format override if needed.
3036+ # Mirrors manual flow:
3037+ # - Global reset (prefer 'reset', fallback to -r)
3038+ # - Pads use MBUS code (never '*P'); if USER_FORMAT ends with P, strip P for pads
3039+ # - Strip any 'field:*' tokens from -V lines
3040+ # - Apply ONLY these 2 links:
3041+ # csiphy*:1 -> csid*:0
3042+ # csid*:1 -> *rdi*:0
3043+ # - Small settle before capture
30373044configure_pipeline_block () {
3038- MEDIA_NODE=" $1 " USER_FORMAT=" $2 "
3039-
3040- media-ctl -d " $MEDIA_NODE " --reset > /dev/null 2>&1
3041-
3042- # Apply MEDIA_CTL_V (override format if USER_FORMAT set)
3045+ MEDIA_NODE=" $1 "
3046+ USER_FORMAT=" $2 "
3047+
3048+ # Reset graph
3049+ if ! media-ctl -d " $MEDIA_NODE " reset > /dev/null 2>&1 ; then
3050+ media-ctl -d " $MEDIA_NODE " -r > /dev/null 2>&1 || true
3051+ fi
3052+
3053+ # Apply pad formats (MBUS, never *P). Also strip 'field:*'.
30433054 printf " %s\n" " $MEDIA_CTL_V_LIST " | while IFS= read -r vline || [ -n " $vline " ]; do
30443055 [ -z " $vline " ] && continue
3045- vline_new=" $vline "
3056+
3057+ curfmt=" $( printf " %s" " $vline " | sed -n ' s/.*fmt:\([^/]*\)\/.*/\1/p' ) "
3058+ newfmt=" $curfmt "
3059+
30463060 if [ -n " $USER_FORMAT " ]; then
3047- vline_new=$( printf " %s" " $vline_new " | sed -E " s/fmt:[^/]+\/([0-9]+x[0-9]+)/fmt:${USER_FORMAT} \/\1/g" )
3061+ case " $USER_FORMAT " in
3062+ * P) newfmt=" ${USER_FORMAT% P} " ;;
3063+ * ) newfmt=" $USER_FORMAT " ;;
3064+ esac
3065+ else
3066+ case " $curfmt " in
3067+ * P) newfmt=" ${curfmt% P} " ;;
3068+ * ) newfmt=" $curfmt " ;;
3069+ esac
30483070 fi
3071+
3072+ vline_new=" $( printf " %s" " $vline " | sed -E " s/fmt:[^/]+/fmt:${newfmt} /" ) "
3073+ vline_new=" $( printf " %s" " $vline_new " | sed -E ' s/ field:[^]]*//g' ) "
3074+
3075+ if [ -n " $YAVTA_W " ] && [ -n " $YAVTA_H " ]; then
3076+ vline_new=" $( printf " %s" " $vline_new " \
3077+ | sed -E " s/(fmt:[^/]+\/)[0-9]+x[0-9]+/\1${YAVTA_W} x${YAVTA_H} /" ) "
3078+ fi
3079+
30493080 media-ctl -d " $MEDIA_NODE " -V " $vline_new " > /dev/null 2>&1
30503081 done
3051-
3052- # Apply MEDIA_CTL_L
3082+
3083+ # Apply ONLY the two links (no fragile case patterns; avoids ShellCheck parse issues).
30533084 printf " %s\n" " $MEDIA_CTL_L_LIST " | while IFS= read -r lline || [ -n " $lline " ]; do
30543085 [ -z " $lline " ] && continue
3055- media-ctl -d " $MEDIA_NODE " -l " $lline " > /dev/null 2>&1
3086+ sline=" $( printf " %s" " $lline " | tr -d ' "' ) "
3087+ if [ " ${sline#* csiphy*: 1->* csid*: 0* } " != " $sline " ]; then
3088+ media-ctl -d " $MEDIA_NODE " -l " $lline " > /dev/null 2>&1
3089+ elif [ " ${sline#* csid*: 1->* rdi*: 0* } " != " $sline " ]; then
3090+ media-ctl -d " $MEDIA_NODE " -l " $lline " > /dev/null 2>&1
3091+ else
3092+ : # ignore others
3093+ fi
30563094 done
3095+
3096+ sleep 0.15
30573097}
3058-
3059- # Executes yavta pipeline controls and captures frames from a video node.
3060- # Handles pre-capture and post-capture register writes, with detailed result code
3098+
3099+ # Executes yavta capture with the same semantics as your manual call.
3100+ # Return codes:
3101+ # 0: PASS (>=1 frame captured)
3102+ # 1: FAIL (capture error)
3103+ # 2: SKIP (unsupported format)
3104+ # 3: SKIP (missing data)
30613105execute_capture_block () {
3062- FRAMES=" $1 " FORMAT=" $2 "
3063-
3064- # Pre-stream controls
3065- printf " %s\n" " $YAVTA_CTRL_PRE_LIST " | while IFS= read -r ctrl; do
3066- [ -z " $ctrl " ] && continue
3067- dev=$( echo " $ctrl " | awk ' {print $1}' )
3068- reg=$( echo " $ctrl " | awk ' {print $2}' )
3069- val=$( echo " $ctrl " | awk ' {print $3}' )
3070- yavta --no-query -w " $reg $val " " $dev " > /dev/null 2>&1
3071- done
3106+ FRAMES=" $1 "
3107+ FORMAT=" $2 "
3108+
3109+ [ -z " $YAVTA_DEV " ] && return 3
3110+ [ -z " $FORMAT " ] && return 3
3111+ [ -z " $YAVTA_W " ] && return 3
3112+ [ -z " $YAVTA_H " ] && return 3
3113+
3114+ # Build args as separate, quoted tokens (fixes SC2086 safely)
3115+ SFLAG=" -s"
3116+ SRES=" ${YAVTA_W} x${YAVTA_H} "
3117+
3118+ CAPS=" $( v4l2-ctl -D -d " $YAVTA_DEV " 2> /dev/null || true) "
3119+ BFLAG=" -B"
3120+ if printf ' %s\n' " $CAPS " | grep -qi ' MPlane' ; then
3121+ BMODE=" capture-mplane"
3122+ else
3123+ BMODE=" capture"
3124+ fi
30723125
3073- # Stream-on controls
3074- printf " %s\n" " $YAVTA_CTRL_LIST " | while IFS= read -r ctrl; do
3075- [ -z " $ctrl " ] && continue
3076- dev=$( echo " $ctrl " | awk ' {print $1}' )
3077- reg=$( echo " $ctrl " | awk ' {print $2}' )
3078- val=$( echo " $ctrl " | awk ' {print $3}' )
3079- yavta --no-query -w " $reg $val " " $dev " > /dev/null 2>&1
3080- done
3126+ sleep 0.12
30813127
3082- # Capture
3083- if [ -n " $YAVTA_DEV " ] && [ -n " $FORMAT " ] && [ -n " $YAVTA_W " ] && [ -n " $YAVTA_H " ]; then
3084- OUT=$( yavta -B capture-mplane -c -I -n " $FRAMES " -f " $FORMAT " -s " ${YAVTA_W} x${YAVTA_H} " -F " $YAVTA_DEV " --capture=" $FRAMES " --file=" frame-#.bin" 2>&1 )
3085- RET=$?
3086- if echo " $OUT " | grep -qi " Unsupported video format" ; then
3087- return 2
3088- elif [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3089- return 0
3090- else
3091- return 1
3092- fi
3093- else
3094- return 3
3128+ do_capture_once () {
3129+ # $1 = mode (capture|capture-mplane)
3130+ yavta " $BFLAG " " $1 " -c -I -n " $FRAMES " -f " $FORMAT " " $SFLAG " " $SRES " \
3131+ -F " $YAVTA_DEV " --capture=" $FRAMES " --file=' frame-#.bin' 2>&1
3132+ return $?
3133+ }
3134+
3135+ OUT=" $( do_capture_once " $BMODE " ) " ; RET=$?
3136+ if [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3137+ return 0
30953138 fi
3139+ echo " $OUT " | grep -qi " Unsupported video format" && return 2
30963140
3097- # Post-stream controls
3098- printf " %s\n" " $YAVTA_CTRL_POST_LIST " | while IFS= read -r ctrl; do
3099- [ -z " $ctrl " ] && continue
3100- dev=$( echo " $ctrl " | awk ' {print $1}' )
3101- reg=$( echo " $ctrl " | awk ' {print $2}' )
3102- val=$( echo " $ctrl " | awk ' {print $3}' )
3103- yavta --no-query -w " $reg $val " " $dev " > /dev/null 2>&1
3104- done
3141+ sleep 0.10
3142+ OUT=" $( do_capture_once " $BMODE " ) " ; RET=$?
3143+ if [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3144+ return 0
3145+ fi
3146+ echo " $OUT " | grep -qi " Unsupported video format" && return 2
3147+
3148+ # Plane flip
3149+ case " $BMODE " in
3150+ capture) FLIPMODE=" capture-mplane" ;;
3151+ * ) FLIPMODE=" capture" ;;
3152+ esac
3153+ OUT=" $( do_capture_once " $FLIPMODE " ) " ; RET=$?
3154+ if [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3155+ return 0
3156+ fi
3157+ echo " $OUT " | grep -qi " Unsupported video format" && return 2
3158+
3159+ # Try P<->non-P sibling of FORMAT
3160+ case " $FORMAT " in * P) ALT=" ${FORMAT% P} " ;; * ) ALT=" ${FORMAT} P" ;; esac
3161+ FORMAT=" $ALT "
3162+ OUT=" $( do_capture_once " $BMODE " ) " ; RET=$?
3163+ if [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3164+ return 0
3165+ fi
3166+ echo " $OUT " | grep -qi " Unsupported video format" && return 2
3167+
3168+ OUT=" $( do_capture_once " $FLIPMODE " ) " ; RET=$?
3169+ if [ $RET -eq 0 ] && echo " $OUT " | grep -q " Captured [1-9][0-9]* frames" ; then
3170+ return 0
3171+ fi
3172+ echo " $OUT " | grep -qi " Unsupported video format" && return 2
3173+
3174+ return 1
3175+ }
3176+
3177+ print_planned_commands () {
3178+ media_node=" $1 "
3179+ pixfmt=" $2 "
3180+
3181+ # Pads should use MBUS code (strip trailing 'P' if present)
3182+ padfmt=" $( printf ' %s' " $pixfmt " | sed ' s/P$//' ) "
3183+
3184+ log_info " [CI] Planned sequence:"
3185+ log_info " media-ctl -d $media_node --reset"
3186+
3187+ # Pad formats: show MBUS (non-P) on -V lines
3188+ if [ -n " $MEDIA_CTL_V_LIST " ]; then
3189+ printf ' %s\n' " $MEDIA_CTL_V_LIST " | while IFS= read -r vline; do
3190+ [ -z " $vline " ] && continue
3191+ vline_out=" $( printf ' %s' " $vline " | sed -E " s/fmt:[^/]+\/([0-9]+x[0-9]+)/fmt:${padfmt} \/\1/g" ) "
3192+ log_info " media-ctl -d $media_node -V '$vline_out '"
3193+ done
3194+ fi
3195+
3196+ # Links unchanged
3197+ if [ -n " $MEDIA_CTL_L_LIST " ]; then
3198+ printf ' %s\n' " $MEDIA_CTL_L_LIST " | while IFS= read -r lline; do
3199+ [ -z " $lline " ] && continue
3200+ log_info " media-ctl -d $media_node -l '$lline '"
3201+ done
3202+ fi
3203+
3204+ # Any pre/post yavta register writes (unchanged)
3205+ if [ -n " $YAVTA_CTRL_PRE_LIST " ]; then
3206+ printf ' %s\n' " $YAVTA_CTRL_PRE_LIST " | while IFS= read -r ctrl; do
3207+ [ -z " $ctrl " ] && continue
3208+ dev=" $( printf ' %s' " $ctrl " | awk ' {print $1}' ) "
3209+ reg=" $( printf ' %s' " $ctrl " | awk ' {print $2}' ) "
3210+ val=" $( printf ' %s' " $ctrl " | awk ' {print $3}' ) "
3211+ [ -n " $dev " ] && [ -n " $reg " ] && [ -n " $val " ] && \
3212+ log_info " yavta --no-query -w '$reg $val ' $dev "
3213+ done
3214+ fi
3215+
3216+ size_arg=" "
3217+ if [ -n " $YAVTA_W " ] && [ -n " $YAVTA_H " ]; then
3218+ size_arg=" -s ${YAVTA_W} x${YAVTA_H} "
3219+ fi
3220+ if [ -n " $YAVTA_DEV " ]; then
3221+ # Show pixel format (SRGGB10P) only on the video node
3222+ log_info " yavta -B capture-mplane -c -I -n $FRAMES -f $pixfmt $size_arg -F $YAVTA_DEV --capture=$FRAMES --file='frame-#.bin'"
3223+ fi
3224+
3225+ if [ -n " $YAVTA_CTRL_POST_LIST " ]; then
3226+ printf ' %s\n' " $YAVTA_CTRL_POST_LIST " | while IFS= read -r ctrl; do
3227+ [ -z " $ctrl " ] && continue
3228+ dev=" $( printf ' %s' " $ctrl " | awk ' {print $1}' ) "
3229+ reg=" $( printf ' %s' " $ctrl " | awk ' {print $2}' ) "
3230+ val=" $( printf ' %s' " $ctrl " | awk ' {print $3}' ) "
3231+ [ -n " $dev " ] && [ -n " $reg " ] && [ -n " $val " ] && \
3232+ log_info " yavta --no-query -w '$reg $val ' $dev "
3233+ done
3234+ fi
31053235}
31063236
31073237log_soc_info () {
0 commit comments