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 <stefa...@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.
-- 
FFmpeg = Funny and Fancy Mournful Puristic Evil Glue
>From 6948454eb19676639a3b403c48774af2a133ed29 Mon Sep 17 00:00:00 2001
From: Stefano Sabatini <stefa...@gmail.com>
Date: Tue, 12 Apr 2016 18:14:45 +0200
Subject: [PATCH] lavf/mpegtsenc: move putstr8 definition up

This allows to use the function in a future commit.
---
 libavformat/mpegtsenc.c | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index fd849e5..b437100 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -255,6 +255,23 @@ static void mpegts_write_pat(AVFormatContext *s)
                           data, q - data);
 }
 
+/* NOTE: !str is accepted for an empty string */
+static void putstr8(uint8_t **q_ptr, const char *str)
+{
+    uint8_t *q;
+    int len;
+
+    q = *q_ptr;
+    if (!str)
+        len = 0;
+    else
+        len = strlen(str);
+    *q++ = len;
+    memcpy(q, str, len);
+    q     += len;
+    *q_ptr = q;
+}
+
 static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 {
     MpegTSWrite *ts = s->priv_data;
@@ -637,23 +654,6 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
     return 0;
 }
 
-/* NOTE: !str is accepted for an empty string */
-static void putstr8(uint8_t **q_ptr, const char *str)
-{
-    uint8_t *q;
-    int len;
-
-    q = *q_ptr;
-    if (!str)
-        len = 0;
-    else
-        len = strlen(str);
-    *q++ = len;
-    memcpy(q, str, len);
-    q     += len;
-    *q_ptr = q;
-}
-
 static void mpegts_write_sdt(AVFormatContext *s)
 {
     MpegTSWrite *ts = s->priv_data;
-- 
1.9.1

>From 20f22c426a9f5c59d28f66a17b59d62301503d67 Mon Sep 17 00:00:00 2001
From: Stefano Sabatini <stefa...@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

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

Reply via email to