@@ -262,6 +262,83 @@ _gather_ffmpeg_vars(){
262
262
fi
263
263
}
264
264
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
+
265
342
_cleanup (){
266
343
_report -wt " Vrecord is being stopped at $( _get_iso8601) , noting this in the capture log."
267
344
_writeingestlog " exit status" " vrecord was forced to quit early at $( _get_iso8601) . Some processing may be incomplete."
@@ -467,14 +544,21 @@ _setup_vrecord_process(){
467
544
VRECORD_STEPS=" 1" # Steps: player
468
545
fi
469
546
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
+
470
554
RECORD_COMMAND=(" ${FFMPEG_BIN} " )
471
555
RECORD_COMMAND+=(-nostdin -nostats " ${TIME_LIMIT[@]} " " ${TC_INPUT_OPTION[@]} " " ${GRAB_INPUT[@]} " )
472
556
if [[ -n " ${VIDEOCODECNAME} " ]] ; then
473
557
MIDDLEOPTIONS+=(-metadata:s:v:0 encoder=" ${VIDEOCODECNAME} " )
474
558
fi
475
559
RECORD_COMMAND+=(" ${MIDDLEOPTIONS[@]} " )
476
560
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[@]} " )
478
562
RECORD_COMMAND+=(-f " ${FORMAT} " " ${VRECORD_OUTPUT} " )
479
563
RECORD_COMMAND+=(" ${EXTRAOUTPUTS[@]} " )
480
564
fi
@@ -1386,6 +1470,7 @@ _edit_mode(){
1386
1470
_passthrough_mode (){
1387
1471
_setup_vrecord_process
1388
1472
if [[ " ${VERBOSE_GTKDIALOG} " = " Y" ]] ; then
1473
+ echo " RUNTYPE ${RUNTYPE} "
1389
1474
echo " STEPS ${VRECORD_STEPS} "
1390
1475
echo " PLAY ${PLAYER_COMMAND[@]} "
1391
1476
echo " RECORD ${RECORD_COMMAND[@]} "
2274
2359
2275
2360
FULL_OUTPUT_ID=" ${PREFIX}${ID}${SUFFIX} "
2276
2361
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"
2278
2365
VRECORD_OUTPUT=" ${DIR} /${FULL_OUTPUT_ID} .${EXTENSION} "
2279
2366
if [[ -f " ${VRECORD_OUTPUT} " ]] ; then
2280
2367
_report -w " A file called ${VRECORD_OUTPUT} already exists."
@@ -2445,7 +2532,12 @@ trap _cleanup SIGHUP SIGINT SIGTERM
2445
2532
if [[ " ${DEVICE_INPUT_CHOICE} " = 0 ]] ; then
2446
2533
# timecode document handling
2447
2534
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} "
2449
2541
fi
2450
2542
2451
2543
# qc tools process
0 commit comments