diff mbox

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

Message ID 20160821084427.GC31228@barisone
State Accepted
Headers show

Commit Message

Stefano Sabatini Aug. 21, 2016, 8:44 a.m. UTC
On date Saturday 2016-08-20 18:57:52 +0200, Michael Niedermayer encoded:
> 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

Another patch is needed (already approved, but doesn't make sense
without this other patch), in attachment.

Comments

Michael Niedermayer Aug. 21, 2016, 4:23 p.m. UTC | #1
On Sun, Aug 21, 2016 at 10:44:27AM +0200, Stefano Sabatini wrote:
> On date Saturday 2016-08-20 18:57:52 +0200, Michael Niedermayer encoded:
> > 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
> 
> Another patch is needed (already approved, but doesn't make sense
> without this other patch), in attachment.

patches probably ok

thx

[...]
Michael Niedermayer Nov. 5, 2016, 6:14 p.m. UTC | #2
On Sun, Aug 21, 2016 at 06:23:21PM +0200, Michael Niedermayer wrote:
> On Sun, Aug 21, 2016 at 10:44:27AM +0200, Stefano Sabatini wrote:
> > On date Saturday 2016-08-20 18:57:52 +0200, Michael Niedermayer encoded:
> > > 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
> > 
> > Another patch is needed (already approved, but doesn't make sense
> > without this other patch), in attachment.
> 
> patches probably ok

ping

[...]
Stefano Sabatini Nov. 6, 2016, 12:21 p.m. UTC | #3
On date Sunday 2016-08-21 18:23:21 +0200, Michael Niedermayer encoded:
> On Sun, Aug 21, 2016 at 10:44:27AM +0200, Stefano Sabatini wrote:
> > On date Saturday 2016-08-20 18:57:52 +0200, Michael Niedermayer encoded:
> > > 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
> > 
> > Another patch is needed (already approved, but doesn't make sense
> > without this other patch), in attachment.
> 
> patches probably ok

Applied, thanks.
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