On Fri, 17 Jul 2020, lance.lmw...@gmail.com wrote:

From: Limin Wang <lance.lmw...@gmail.com>

In SMPTE ST 12-1: 2014 Sec 12.2, we need to mark the frame flag if the frame rate 
> 30FPS to
avoid interoperability issues. It will be used by the encoder to identify even 
or odd frames
and correctly calculate the frame number of the SEI TC.

This feature looks like it belongs to av_timecode_get_smpte_from_framenum and not into decklink. Also checking previous timecode and guessing something is a hack, especially since you have the exact source timecode.

Regards,
Marton


---
libavdevice/decklink_common.h |  1 +
libavdevice/decklink_dec.cpp  | 14 ++++++++++++++
2 files changed, 15 insertions(+)

diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h
index bd68c7b..8ddc411 100644
--- a/libavdevice/decklink_common.h
+++ b/libavdevice/decklink_common.h
@@ -151,6 +151,7 @@ struct decklink_ctx {
    int channels;
    int audio_depth;
    unsigned long tc_seen;    // used with option wait_for_tc
+    uint32_t last_tc;
};

typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t;
diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
index dde68ff..a60c01b 100644
--- a/libavdevice/decklink_dec.cpp
+++ b/libavdevice/decklink_dec.cpp
@@ -884,12 +884,26 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
                        int metadata_len;
                        uint8_t* packed_metadata;
                        AVTimecode tcr;
+                        AVRational rate = ctx->video_st->r_frame_rate;

                        if (av_timecode_init_from_string(&tcr, 
ctx->video_st->r_frame_rate, tc, ctx) >= 0) {
                            uint32_t tc_data = 
av_timecode_get_smpte_from_framenum(&tcr, 0);
                            int size = sizeof(uint32_t) * 4;
                            uint32_t *sd = (uint32_t 
*)av_packet_new_side_data(&pkt, AV_PKT_DATA_S12M_TIMECODE, size);

+                            /* set the field flag if frame rate > 30FPS */
+                            /* Refer to SMPTE ST 12-1:2014 Sec 12.2 */
+                            if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) {
+                                /* Odd frame */
+                                if (ctx->last_tc == tc_data) {
+                                    if (av_cmp_q(rate, (AVRational) {50, 1}) 
== 0)
+                                        tc_data |= (1 << 7);
+                                    else
+                                        tc_data |= (1 << 23);
+                                }
+                            }
+                            ctx->last_tc = tc_data;
+
                            if (sd) {
                                *sd       = 1;       // one TC
                                *(sd + 1) = tc_data; // TC
--
2.9.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to