Skip to content

Commit d6fb8fd

Browse files
committed
add live eia608 caption extraction during NTSC capture
will add a sidecar scc files, based on sccyou
1 parent 6696f08 commit d6fb8fd

File tree

2 files changed

+132
-3
lines changed

2 files changed

+132
-3
lines changed

ccp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#/bin/bash
2+
3+
PREV_CC="8080"
4+
CC_PRESENT=0
5+
while IFS="=" read KEY VALUE ; dos
6+
if [[ -n "${CC_HEX}" ]] ; then
7+
CC="${CC_HEX:2:4}"
8+
if { [[ "${CC}" != "8080" ]] && [[ "${PREV_CC}" == "8080" ]] ; } || { [[ "${CC}" == "9420" ]] && [[ "${PREV_CC}" != "9420" ]] ; } ; then
9+
_write_new_cc_line
10+
_write_cc "$CC"
11+
elif [[ "${CC}" != "8080" ]] ; then
12+
_write_cc "$CC"
13+
fi
14+
PREV_CC="$CC"
15+
if [[ "$CC_PRESENT" == 0 ]] ; then
16+
CC_PRESENT=1
17+
if [[ -n "${CC_LOG}" ]] ; then
18+
TRANSITION_TIME="$(_hhmmssmmm_to_hhmmssff "${SECS}")"
19+
_report -d "${CC_LOG} - ${TRANSITION_TIME}."
20+
fi
21+
TRANSITION_TIME="$(_hhmmssmmm_to_hhmmssff "${SECS}")"
22+
CC_LOG="Caption data ON: ${TRANSITION_TIME}"
23+
fi
24+
else
25+
if [[ "$CC_PRESENT" == 1 ]] ; then
26+
CC_PRESENT=0
27+
if [[ -n "${CC_LOG}" ]] ; then
28+
TRANSITION_TIME="$(_hhmmssmmm_to_hhmmssff "${SECS}")"
29+
_report -d "${CC_LOG} - ${TRANSITION_TIME}."
30+
fi
31+
TRANSITION_TIME="$(_hhmmssmmm_to_hhmmssff "${SECS}")"
32+
CC_LOG="Caption data OFF: ${TRANSITION_TIME}"
33+
fi
34+
PREV_CC="8080"
35+
fi
36+
PREV_SECS="$SECS"
37+
done < <(grep -o "pts_time:[^ ]*\|lavfi.readeia608.0.cc=[^ ]*" /Users/daverice/Desktop/vrecord_tests/TEST9954_ffv1_frame_eia608data.txt)

vrecord

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,83 @@ _gather_ffmpeg_vars(){
262262
fi
263263
}
264264

265+
_eia608dump2scc(){
266+
EIA608DUMP_IN="${1}"
267+
SCC_OUT="${2}"
268+
269+
_smmm_to_hhmmssff(){
270+
secs="$1"
271+
echo "${secs}" | awk '{ printf "%02i:%02i:%02i:%02i\n", $1/60/60, $1/60%60, $1%60, $1%1*30 }'
272+
}
273+
_write_cc(){
274+
CC="$1"
275+
if [[ "$START" == "Y" ]] ; then
276+
echo -n " ${CC}" >> "${SCC_OUT}"
277+
else
278+
echo -n " ${CC}" >> "${SCC_OUT}"
279+
fi
280+
START="N"
281+
}
282+
_write_new_cc_line(){
283+
SCC_TIME="$(_smmm_to_hhmmssff "${SECS}")"
284+
echo -e -n "\n\n${SCC_TIME}" >> "${SCC_OUT}"
285+
START="Y"
286+
}
287+
_start_scc(){
288+
echo -n "Scenarist_SCC V1.0" > "${SCC_OUT}"
289+
}
290+
_end_scc(){
291+
echo >> "${SCC_OUT}"
292+
}
293+
#initialize
294+
PREV_CC="8080"
295+
CC_PRESENT=0
296+
REPORT=0
297+
298+
_start_scc
299+
while read METADATA_LINE ; do
300+
if [[ "${METADATA_LINE:0:8}" == "pts_time" ]] ; then
301+
SECS="${METADATA_LINE/pts_time:}"
302+
REPORT=0
303+
elif [[ "${METADATA_LINE:0:21}" == "lavfi.readeia608.0.cc" ]] ; then
304+
CC_HEX="${METADATA_LINE/lavfi.readeia608.0.cc=}"
305+
REPORT=1
306+
if [[ -n "${CC_HEX}" && "${REPORT}" ]] ; then
307+
CC="${CC_HEX:2:4}"
308+
if { [[ "${CC}" != "8080" ]] && [[ "${PREV_CC}" == "8080" ]] ; } || { [[ "${CC}" == "9420" ]] && [[ "${PREV_CC}" != "9420" ]] ; } ; then
309+
_write_new_cc_line
310+
_write_cc "$CC"
311+
elif [[ "${CC}" != "8080" ]] ; then
312+
_write_cc "$CC"
313+
fi
314+
PREV_CC="$CC"
315+
if [[ "$CC_PRESENT" == 0 ]] ; then
316+
CC_PRESENT=1
317+
if [[ -n "${CC_LOG}" ]] ; then
318+
TRANSITION_TIME="$(_smmm_to_hhmmssff "${SECS}")"
319+
_report -d "${CC_LOG} - ${TRANSITION_TIME}."
320+
fi
321+
TRANSITION_TIME="$(_smmm_to_hhmmssff "${SECS}")"
322+
CC_LOG="Caption data ON: ${TRANSITION_TIME}"
323+
fi
324+
else
325+
if [[ "$CC_PRESENT" == 1 ]] ; then
326+
CC_PRESENT=0
327+
if [[ -n "${CC_LOG}" ]] ; then
328+
TRANSITION_TIME="$(_smmm_to_hhmmssff "${SECS}")"
329+
_report -d "${CC_LOG} - ${TRANSITION_TIME}."
330+
fi
331+
TRANSITION_TIME="$(_smmm_to_hhmmssff "${SECS}")"
332+
CC_LOG="Caption data OFF: ${TRANSITION_TIME}"
333+
fi
334+
PREV_CC="8080"
335+
fi
336+
PREV_SECS="$SECS"
337+
fi
338+
done < <(grep -o "pts_time:[^ ]*\|lavfi.readeia608.0.cc=[^ ]*" "${EIA608DUMP_IN}")
339+
_end_scc
340+
}
341+
265342
_cleanup(){
266343
_report -wt "Vrecord is being stopped at $(_get_iso8601), noting this in the capture log."
267344
_writeingestlog "exit status" "vrecord was forced to quit early at $(_get_iso8601). Some processing may be incomplete."
@@ -467,14 +544,21 @@ _setup_vrecord_process(){
467544
VRECORD_STEPS="1" # Steps: player
468545
fi
469546
fi
547+
548+
# caption handling if ntsc
549+
if [[ "${STANDARD}" == "ntsc" ]] ; then
550+
CAPTION_TMP="$(_maketemp .eia608.txt)"
551+
CAPTION_WRITE=",readeia608=lp=1:spw=0.27,metadata=mode=print:key=lavfi.readeia608.0.cc:file=${CAPTION_TMP}"
552+
fi
553+
470554
RECORD_COMMAND=("${FFMPEG_BIN}")
471555
RECORD_COMMAND+=(-nostdin -nostats "${TIME_LIMIT[@]}" "${TC_INPUT_OPTION[@]}" "${GRAB_INPUT[@]}")
472556
if [[ -n "${VIDEOCODECNAME}" ]] ; then
473557
MIDDLEOPTIONS+=(-metadata:s:v:0 encoder="${VIDEOCODECNAME}")
474558
fi
475559
RECORD_COMMAND+=("${MIDDLEOPTIONS[@]}")
476560
if [[ "${RUNTYPE}" = "record" ]] ; then
477-
RECORD_COMMAND+=(-filter_complex "[0:v:0]${RECORDINGFILTER}${TC_WRITE}; ${AUDIOMAP}" "${AUDIO_CHANNEL_MAP[@]}")
561+
RECORD_COMMAND+=(-filter_complex "[0:v:0]${RECORDINGFILTER}${TC_WRITE}${CAPTION_WRITE};${AUDIOMAP}" "${AUDIO_CHANNEL_MAP[@]}")
478562
RECORD_COMMAND+=(-f "${FORMAT}" "${VRECORD_OUTPUT}")
479563
RECORD_COMMAND+=("${EXTRAOUTPUTS[@]}")
480564
fi
@@ -1386,6 +1470,7 @@ _edit_mode(){
13861470
_passthrough_mode(){
13871471
_setup_vrecord_process
13881472
if [[ "${VERBOSE_GTKDIALOG}" = "Y" ]] ; then
1473+
echo "RUNTYPE ${RUNTYPE}"
13891474
echo "STEPS ${VRECORD_STEPS}"
13901475
echo "PLAY ${PLAYER_COMMAND[@]}"
13911476
echo "RECORD ${RECORD_COMMAND[@]}"
@@ -2274,7 +2359,9 @@ fi
22742359

22752360
FULL_OUTPUT_ID="${PREFIX}${ID}${SUFFIX}"
22762361
FULL_CAPTURE_LOG="${LOGDIR}/${FULL_OUTPUT_ID}${CAPTURELOGSUFFIX}"
2277-
2362+
TIMECODE_LOG="${LOGDIR}/${FULL_OUTPUT_ID}_${TC_TYPE}${TIMECODELOGSUFFIX}"
2363+
CAPTION_LOG="${LOGDIR}/${FULL_OUTPUT_ID}_frame_eia608data.txt"
2364+
CAPTION_SCC="${LOGDIR}/${FULL_OUTPUT_ID}.scc"
22782365
VRECORD_OUTPUT="${DIR}/${FULL_OUTPUT_ID}.${EXTENSION}"
22792366
if [[ -f "${VRECORD_OUTPUT}" ]] ; then
22802367
_report -w "A file called ${VRECORD_OUTPUT} already exists."
@@ -2445,7 +2532,12 @@ trap _cleanup SIGHUP SIGINT SIGTERM
24452532
if [[ "${DEVICE_INPUT_CHOICE}" = 0 ]] ; then
24462533
# timecode document handling
24472534
if [[ -f "${TC_TMP}" ]] ; then
2448-
mv "${TC_TMP}" "${LOGDIR}/${FULL_OUTPUT_ID}_${TC_TYPE}${TIMECODELOGSUFFIX}"
2535+
mv "${TC_TMP}" "${TIMECODE_LOG}"
2536+
fi
2537+
# caption handling
2538+
if [[ -f "${CAPTION_TMP}" ]] ; then
2539+
mv "${CAPTION_TMP}" "${CAPTION_LOG}"
2540+
_eia608dump2scc "${CAPTION_LOG}" "${CAPTION_SCC}"
24492541
fi
24502542

24512543
# qc tools process

0 commit comments

Comments
 (0)