From: Limin Wang <[email protected]>
---
libavcodec/internal.h | 3 ++-
libavcodec/nvenc.c | 2 +-
libavcodec/utils.c | 13 ++++++++++++-
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 0a1c0a1..4c34d7d 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -382,6 +382,7 @@ int ff_alloc_a53_sei(const AVFrame *frame, size_t
prefix_len,
* Check AVFrame for S12M timecode side data and allocate and fill TC SEI
message with timecode info
*
* @param frame Raw frame to get S12M timecode side data from
+ * @param rate The frame rate
* @param prefix_len Number of bytes to allocate before SEI message
* @param data Pointer to a variable to store allocated memory
* Upon return the variable will hold NULL on error or if
frame has no S12M timecode info.
@@ -390,7 +391,7 @@ int ff_alloc_a53_sei(const AVFrame *frame, size_t
prefix_len,
* @param sei_size Pointer to a variable to store generated SEI message
length
* @return Zero on success, negative error code on failure
*/
-int ff_alloc_timecode_sei(const AVFrame *frame, size_t prefix_len,
+int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t
prefix_len,
void **data, size_t *sei_size);
/**
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index c6740c1..45a7b60 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -2218,7 +2218,7 @@ static int nvenc_send_frame(AVCodecContext *avctx, const
AVFrame *frame)
void *tc_data = NULL;
size_t tc_size = 0;
- if (ff_alloc_timecode_sei(frame, 0, (void**)&tc_data, &tc_size) <
0) {
+ if (ff_alloc_timecode_sei(frame, avctx->framerate, 0,
(void**)&tc_data, &tc_size) < 0) {
av_log(ctx, AV_LOG_ERROR, "Not enough memory for timecode sei,
skipping\n");
}
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 2ece34f..51c4067 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2254,7 +2254,7 @@ static unsigned bcd2uint(uint8_t bcd)
return low + 10*high;
}
-int ff_alloc_timecode_sei(const AVFrame *frame, size_t prefix_len,
+int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t
prefix_len,
void **data, size_t *sei_size)
{
AVFrameSideData *sd = NULL;
@@ -2290,6 +2290,17 @@ int ff_alloc_timecode_sei(const AVFrame *frame, size_t
prefix_len,
unsigned ff = bcd2uint(tcsmpte>>24 & 0x3f); // 6-bit frames
unsigned drop = tcsmpte & 1<<30 && !0; // 1-bit drop if not arbitrary
bit
+ /* Calculate frame number of HEVC by SMPTE ST 12-1:2014 Sec 12.2 if
rate > 30FPS */
+ if (av_cmp_q(rate, (AVRational) {30, 1}) == 1) {
+ unsigned pc;
+ ff *= 2;
+ if (av_cmp_q(rate, (AVRational) {50, 1}) == 0)
+ pc = !!(tcsmpte & 1 << 7);
+ else
+ pc = !!(tcsmpte & 1 << 23);
+ ff = (ff + pc) & 0x7f;
+ }
+
put_bits(&pb, 1, 1); // clock_timestamp_flag
put_bits(&pb, 1, 1); // units_field_based_flag
put_bits(&pb, 5, 0); // counting_type
--
2.9.4
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".