Re: [FFmpeg-devel] [PATCH 2/2] avcodec/utils: calculate frame number of HEVC if the framerate > 30FPS

2020-08-14 Thread lance . lmwang
On Fri, Jul 17, 2020 at 09:26:38PM +0800, lance.lmw...@gmail.com wrote:
> From: Limin Wang 
> 
> ---
>  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**)_data, _size) 
> < 0) {
> +if (ff_alloc_timecode_sei(frame, avctx->framerate, 0, 
> (void**)_data, _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(, 1, 1); // clock_timestamp_flag
>  put_bits(, 1, 1); // units_field_based_flag
>  put_bits(, 5, 0); // counting_type
> -- 
> 2.9.4

ping the patch.


> 

-- 
Thanks,
Limin Wang
___
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] [PATCH 2/2] avcodec/utils: calculate frame number of HEVC if the framerate > 30FPS

2020-07-17 Thread lance . lmwang
From: Limin Wang 

---
 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**)_data, _size) < 
0) {
+if (ff_alloc_timecode_sei(frame, avctx->framerate, 0, 
(void**)_data, _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(, 1, 1); // clock_timestamp_flag
 put_bits(, 1, 1); // units_field_based_flag
 put_bits(, 5, 0); // counting_type
-- 
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".