Skip to content

Commit 14b5980

Browse files
committed
harden media-ctl/yavta helpers and POSIX-ify
configure_pipeline_block keeps MBUS on pads (strip trailing 'P'); updates WxH only. execute_capture_block adds mplane detection, packed↔unpacked + plane-flip fallbacks. Fix case quoting and strict quoting; remove non-POSIX 'local'; MEDIA_LINK_FILTER=all. Signed-off-by: Srikanth Muppandam <[email protected]>
1 parent f2f1080 commit 14b5980

File tree

1 file changed

+183
-53
lines changed

1 file changed

+183
-53
lines changed

Runner/utils/functestlib.sh

Lines changed: 183 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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
30373044
configure_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)
30613105
execute_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

31073237
log_soc_info() {

0 commit comments

Comments
 (0)