]> git.sesse.net Git - vlc/blobdiff - modules/codec/opus_header.c
PGS: fix end-time
[vlc] / modules / codec / opus_header.c
index 0c31af27b7ccc10d2b04c9e8ea3f94469c1c702f..392b673b2b1368f333ceb3d25691f80568c2ffc8 100644 (file)
@@ -30,7 +30,6 @@
 #endif
 
 #include "opus_header.h"
-#include <opus.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -74,7 +73,7 @@ typedef struct {
     int pos;
 } ROPacket;
 
-static int write_uint32(Packet *p, ogg_uint32_t val)
+static int write_uint32(Packet *p, uint32_t val)
 {
     if (p->pos>p->maxlen-4)
         return 0;
@@ -86,7 +85,7 @@ static int write_uint32(Packet *p, ogg_uint32_t val)
     return 1;
 }
 
-static int write_uint16(Packet *p, ogg_uint16_t val)
+static int write_uint16(Packet *p, uint16_t val)
 {
     if (p->pos>p->maxlen-2)
         return 0;
@@ -105,24 +104,24 @@ static int write_chars(Packet *p, const unsigned char *str, int nb_chars)
     return 1;
 }
 
-static int read_uint32(ROPacket *p, ogg_uint32_t *val)
+static int read_uint32(ROPacket *p, uint32_t *val)
 {
     if (p->pos>p->maxlen-4)
         return 0;
-    *val =  (ogg_uint32_t)p->data[p->pos  ];
-    *val |= (ogg_uint32_t)p->data[p->pos+1]<< 8;
-    *val |= (ogg_uint32_t)p->data[p->pos+2]<<16;
-    *val |= (ogg_uint32_t)p->data[p->pos+3]<<24;
+    *val =  (uint32_t)p->data[p->pos  ];
+    *val |= (uint32_t)p->data[p->pos+1]<< 8;
+    *val |= (uint32_t)p->data[p->pos+2]<<16;
+    *val |= (uint32_t)p->data[p->pos+3]<<24;
     p->pos += 4;
     return 1;
 }
 
-static int read_uint16(ROPacket *p, ogg_uint16_t *val)
+static int read_uint16(ROPacket *p, uint16_t *val)
 {
     if (p->pos>p->maxlen-2)
         return 0;
-    *val =  (ogg_uint16_t)p->data[p->pos  ];
-    *val |= (ogg_uint16_t)p->data[p->pos+1]<<8;
+    *val =  (uint16_t)p->data[p->pos  ];
+    *val |= (uint16_t)p->data[p->pos+1]<<8;
     p->pos += 2;
     return 1;
 }
@@ -141,7 +140,7 @@ int opus_header_parse(const unsigned char *packet, int len, OpusHeader *h)
     char str[9];
     ROPacket p;
     unsigned char ch;
-    ogg_uint16_t shortval;
+    uint16_t shortval;
 
     p.data = packet;
     p.maxlen = len;
@@ -236,11 +235,12 @@ The comment header is decoded as follows:
   7) done.
 */
 
-static char *comment_init(size_t *length)
+static char *comment_init(size_t *length, const char *vendor)
 {
     /*The 'vendor' field should be the actual encoding library used.*/
-    const char *vendor_string = opus_get_version_string();
-    int vendor_length = strlen(vendor_string);
+    if (!vendor)
+        vendor = "unknown";
+    int vendor_length = strlen(vendor);
 
     int user_comment_list_length = 0;
     int len = 8 + 4 + vendor_length + 4;
@@ -250,7 +250,7 @@ static char *comment_init(size_t *length)
 
     memcpy(p, "OpusTags", 8);
     SetDWLE(p + 8, vendor_length);
-    memcpy(p + 12, vendor_string, vendor_length);
+    memcpy(p + 12, vendor, vendor_length);
     SetDWLE(p + 12 + vendor_length, user_comment_list_length);
 
     *length = len;
@@ -299,7 +299,7 @@ static int comment_pad(char **comments, size_t *length)
     return 0;
 }
 
-int opus_prepare_header(unsigned channels, unsigned rate, OpusHeader *header)
+void opus_prepare_header(unsigned channels, unsigned rate, OpusHeader *header)
 {
     header->version = 1;
     header->channels = channels;
@@ -309,8 +309,6 @@ int opus_prepare_header(unsigned channels, unsigned rate, OpusHeader *header)
     header->gain = 0; // 0dB
     header->channel_mapping = header->channels > 8 ? 255 :
                               header->channels > 2;
-
-    return 0;
 }
 
 static int opus_header_to_packet(const OpusHeader *h, unsigned char *packet, int len)
@@ -367,21 +365,20 @@ static int opus_header_to_packet(const OpusHeader *h, unsigned char *packet, int
     return p.pos;
 }
 
-int opus_write_header(uint8_t **p_extra, int *i_extra, OpusHeader *header)
+int opus_write_header(uint8_t **p_extra, int *i_extra, OpusHeader *header, const char *vendor)
 {
     unsigned char header_data[100];
     const int packet_size = opus_header_to_packet(header, header_data,
                                                   sizeof(header_data));
-    ogg_packet headers[2];
-    headers[0].packet = header_data;
-    headers[0].bytes = packet_size;
-    headers[0].b_o_s = 1;
-    headers[0].e_o_s = 0;
-    headers[0].granulepos = 0;
-    headers[0].packetno = 0;
+
+    unsigned char *data[2];
+    size_t size[2];
+
+    data[0] = header_data;
+    size[0] = packet_size;
 
     size_t comments_length;
-    char *comments = comment_init(&comments_length);
+    char *comments = comment_init(&comments_length, vendor);
     if (!comments)
         return 1;
     if (comment_add(&comments, &comments_length, "ENCODER=",
@@ -397,22 +394,15 @@ int opus_write_header(uint8_t **p_extra, int *i_extra, OpusHeader *header)
         return 1;
     }
 
-    headers[1].packet = (unsigned char *) comments;
-    headers[1].bytes = comments_length;
-    headers[1].b_o_s = 0;
-    headers[1].e_o_s = 0;
-    headers[1].granulepos = 0;
-    headers[1].packetno = 1;
+    data[1] = (unsigned char *) comments;
+    size[1] = comments_length;
 
-    for (unsigned i = 0; i < ARRAY_SIZE(headers); ++i)
-    {
-        if (xiph_AppendHeaders(i_extra, (void **) p_extra,
-                               headers[i].bytes, headers[i].packet))
+    for (unsigned i = 0; i < ARRAY_SIZE(data); ++i)
+        if (xiph_AppendHeaders(i_extra, (void **) p_extra, size[i], data[i]))
         {
             *i_extra = 0;
             *p_extra = NULL;
         }
-    }
 
     return 0;
 }