History

avdevice/decklink_dec: capture timecode to metadata when requested

If the user provides a valid timecode_format look for timecode of that format in the capture and if found store it on the video avstream's metadata. Slightly modified by Marton Balint to capture per-frame timecode as well.

Jon Morley committed 8 years ago

Commit 0946c0e1 parent fb480a16 files · +69 −1Browse files

Showing the changes to libavdevice/decklink_dec.cpp (1 of 6 files). Show all

Unified · Split

libavdevice/decklink_dec.cpp+40−0
@@ -752,6 +752,35 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( · 751 unmodified lines
752752 "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped);
753753 }
754754 no_video = 0;
755+
756+ // Handle Timecode (if requested)
757+ if (ctx->tc_format) {
758+ IDeckLinkTimecode *timecode;
759+ if (videoFrame->GetTimecode(ctx->tc_format, &timecode) == S_OK) {
760+ const char *tc = NULL;
761+ DECKLINK_STR decklink_tc;
762+ if (timecode->GetString(&decklink_tc) == S_OK) {
763+ tc = DECKLINK_STRDUP(decklink_tc);
764+ DECKLINK_FREE(decklink_tc);
765+ }
766+ timecode->Release();
767+ if (tc) {
768+ AVDictionary* metadata_dict = NULL;
769+ int metadata_len;
770+ uint8_t* packed_metadata;
771+ if (av_dict_set(&metadata_dict, "timecode", tc, AV_DICT_DONT_STRDUP_VAL) >= 0) {
772+ packed_metadata = av_packet_pack_dictionary(metadata_dict, &metadata_len);
773+ av_dict_free(&metadata_dict);
774+ if (packed_metadata) {
775+ if (av_packet_add_side_data(&pkt, AV_PKT_DATA_STRINGS_METADATA, packed_metadata, metadata_len) < 0)
776+ av_freep(&packed_metadata);
777+ }
778+ }
779+ }
780+ } else {
781+ av_log(avctx, AV_LOG_DEBUG, "Unable to find timecode.\n");
782+ }
783+ }
755784 }
756785
757786 pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock, abs_wallclock, ctx->video_pts_source, ctx->video_st->time_base, &initial_video_pts, cctx->copyts);
@@ -969,6 +998,8 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) · 211 unmodified lines
969998 ctx->teletext_lines = cctx->teletext_lines;
970999 ctx->preroll = cctx->preroll;
9711000 ctx->duplex_mode = cctx->duplex_mode;
1001+ if (cctx->tc_format > 0 && (unsigned int)cctx->tc_format < FF_ARRAY_ELEMS(decklink_timecode_format_map))
1002+ ctx->tc_format = decklink_timecode_format_map[cctx->tc_format];
9721003 if (cctx->video_input > 0 && (unsigned int)cctx->video_input < FF_ARRAY_ELEMS(decklink_video_connection_map))
9731004 ctx->video_input = decklink_video_connection_map[cctx->video_input];
9741005 if (cctx->audio_input > 0 && (unsigned int)cctx->audio_input < FF_ARRAY_ELEMS(decklink_audio_connection_map))
@@ -1222,6 +1253,15 @@ int ff_decklink_read_packet(AVFormatContext *avctx, AVPacket *pkt) · 247 unmodified lines
12221253
12231254 avpacket_queue_get(&ctx->queue, pkt, 1);
12241255
1256+ if (ctx->tc_format && !(av_dict_get(ctx->video_st->metadata, "timecode", NULL, 0))) {
1257+ int size;
1258+ const uint8_t *side_metadata = av_packet_get_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, &size);
1259+ if (side_metadata) {
1260+ if (av_packet_unpack_dictionary(side_metadata, size, &ctx->video_st->metadata) < 0)
1261+ av_log(avctx, AV_LOG_ERROR, "Unable to set timecode\n");
1262+ }
1263+ }
1264+
12251265 return 0;
12261266 }
12271267

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t