diff mbox

[FFmpeg-devel] lavf/mpegtsenc: write metadata descriptor for timed ID3 packets

Message ID 20160820134835.GA31228@barisone
State Superseded
Headers show

Commit Message

Stefano Sabatini Aug. 20, 2016, 1:48 p.m. UTC
On date Thursday 2016-05-19 18:45:35 +0200, Stefano Sabatini encoded:
> This is required since some softwares are not able to correctly recognize
> the metadata.
> ---
>  libavformat/mpegtsenc.c | 24 ++++++++++++++----------
>  1 file changed, 14 insertions(+), 10 deletions(-)

Updated, with some more documentation and references to the MPEGTS
standard.

Note: this patch was created comparing the output of FFmpeg with those
from encoding.com and elemental. With the change the output metadata
can be read by third-party players.

If the maintainers prefer, I can enable this output mode through a
flag.

Comments

Michael Niedermayer Aug. 20, 2016, 4:57 p.m. UTC | #1
On Sat, Aug 20, 2016 at 03:48:35PM +0200, Stefano Sabatini wrote:
> On date Thursday 2016-05-19 18:45:35 +0200, Stefano Sabatini encoded:
> > This is required since some softwares are not able to correctly recognize
> > the metadata.
> > ---
> >  libavformat/mpegtsenc.c | 24 ++++++++++++++----------
> >  1 file changed, 14 insertions(+), 10 deletions(-)
> 
> Updated, with some more documentation and references to the MPEGTS
> standard.
> 
> Note: this patch was created comparing the output of FFmpeg with those
> from encoding.com and elemental. With the change the output metadata
> can be read by third-party players.
> 
> If the maintainers prefer, I can enable this output mode through a
> flag.
> -- 
> FFmpeg = Fiendish & Fiendish Mastering Purposeless Egregious Goblin

>  mpegtsenc.c |   24 ++++++++++++++----------
>  1 file changed, 14 insertions(+), 10 deletions(-)
> 3a6655bca70653c64bfb5f2073d01feee73e64c2  0003-lavf-mpegtsenc-write-metadata-descriptor-for-timed-I.patch
> From 20f22c426a9f5c59d28f66a17b59d62301503d67 Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefasab@gmail.com>
> Date: Tue, 12 Apr 2016 18:16:21 +0200
> Subject: [PATCH] lavf/mpegtsenc: write metadata descriptor for timed ID3
>  packets
> 
> This is required since some programs are not able to correctly recognize
> the metadata. See H.222, 2.6.58 Metadata pointer descriptor.
> 
> putstr8() is modified in order to allow to skip writing the string
> length.
> ---
>  libavformat/mpegtsenc.c | 24 ++++++++++++++----------
>  1 file changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index b437100..6f40615 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c
> @@ -256,7 +256,7 @@ static void mpegts_write_pat(AVFormatContext *s)
>  }
>  
>  /* NOTE: !str is accepted for an empty string */
> -static void putstr8(uint8_t **q_ptr, const char *str)
> +static void putstr8(uint8_t **q_ptr, const char *str, int write_len)

breaks build, putstr8() seems after the place where a use is added
in git master, or i did somehing silly

libavformat/mpegtsenc.c: In function ‘mpegts_write_pmt’:
libavformat/mpegtsenc.c:618:17: error: implicit declaration of function ‘putstr8’ [-Werror=implicit-function-declaration]
libavformat/mpegtsenc.c: At top level:
libavformat/mpegtsenc.c:644:13: warning: conflicting types for ‘putstr8’ [enabled by default]
libavformat/mpegtsenc.c:644:13: error: static declaration of ‘putstr8’ follows non-static declaration
libavformat/mpegtsenc.c:618:17: note: previous implicit declaration of ‘putstr8’ was here
cc1: some warnings being treated as errors
make: *** [libavformat/mpegtsenc.o] Error 1

[...]
diff mbox

Patch

From 20f22c426a9f5c59d28f66a17b59d62301503d67 Mon Sep 17 00:00:00 2001
From: Stefano Sabatini <stefasab@gmail.com>
Date: Tue, 12 Apr 2016 18:16:21 +0200
Subject: [PATCH] lavf/mpegtsenc: write metadata descriptor for timed ID3
 packets

This is required since some programs are not able to correctly recognize
the metadata. See H.222, 2.6.58 Metadata pointer descriptor.

putstr8() is modified in order to allow to skip writing the string
length.
---
 libavformat/mpegtsenc.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index b437100..6f40615 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -256,7 +256,7 @@  static void mpegts_write_pat(AVFormatContext *s)
 }
 
 /* NOTE: !str is accepted for an empty string */
-static void putstr8(uint8_t **q_ptr, const char *str)
+static void putstr8(uint8_t **q_ptr, const char *str, int write_len)
 {
     uint8_t *q;
     int len;
@@ -266,7 +266,8 @@  static void putstr8(uint8_t **q_ptr, const char *str)
         len = 0;
     else
         len = strlen(str);
-    *q++ = len;
+    if (write_len)
+        *q++ = len;
     memcpy(q, str, len);
     q     += len;
     *q_ptr = q;
@@ -628,12 +629,15 @@  static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
                 *q++ = 'V';
                 *q++ = 'A';
             } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
-                *q++ = 0x5; /* MPEG-2 registration descriptor */
-                *q++ = 4;
-                *q++ = 'I';
-                *q++ = 'D';
-                *q++ = '3';
-                *q++ = ' ';
+                const char *tag = "ID3 ";
+                *q++ = 0x26; /* metadata descriptor */
+                *q++ = 13;
+                put16(&q, 0xffff);    /* metadata application format */
+                putstr8(&q, tag, 0);
+                *q++ = 0xff;        /* metadata format */
+                putstr8(&q, tag, 0);
+                *q++ = 0;            /* metadata service ID */
+                *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
             }
             break;
         }
@@ -678,8 +682,8 @@  static void mpegts_write_sdt(AVFormatContext *s)
         desc_len_ptr = q;
         q++;
         *q++         = ts->service_type;
-        putstr8(&q, service->provider_name);
-        putstr8(&q, service->name);
+        putstr8(&q, service->provider_name, 1);
+        putstr8(&q, service->name, 1);
         desc_len_ptr[0] = q - desc_len_ptr - 1;
 
         /* fill descriptor length */
-- 
1.9.1