Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * VorbisComment writer
  3.  * Copyright (c) 2009 James Darnley
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. #include "avformat.h"
  23. #include "metadata.h"
  24. #include "vorbiscomment.h"
  25. #include "libavcodec/bytestream.h"
  26. #include "libavutil/dict.h"
  27.  
  28. /**
  29.  * VorbisComment metadata conversion mapping.
  30.  * from Ogg Vorbis I format specification: comment field and header specification
  31.  * http://xiph.org/vorbis/doc/v-comment.html
  32.  */
  33. const AVMetadataConv ff_vorbiscomment_metadata_conv[] = {
  34.     { "ALBUMARTIST", "album_artist"},
  35.     { "TRACKNUMBER", "track"  },
  36.     { "DISCNUMBER",  "disc"   },
  37.     { "DESCRIPTION", "comment" },
  38.     { 0 }
  39. };
  40.  
  41. int64_t ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string)
  42. {
  43.     int64_t len = 8;
  44.     len += strlen(vendor_string);
  45.     if (m) {
  46.         AVDictionaryEntry *tag = NULL;
  47.         while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
  48.             len += 4 +strlen(tag->key) + 1 + strlen(tag->value);
  49.         }
  50.     }
  51.     return len;
  52. }
  53.  
  54. int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m,
  55.                            const char *vendor_string)
  56. {
  57.     bytestream_put_le32(p, strlen(vendor_string));
  58.     bytestream_put_buffer(p, vendor_string, strlen(vendor_string));
  59.     if (*m) {
  60.         int count = av_dict_count(*m);
  61.         AVDictionaryEntry *tag = NULL;
  62.         bytestream_put_le32(p, count);
  63.         while ((tag = av_dict_get(*m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
  64.             int64_t len1 = strlen(tag->key);
  65.             int64_t len2 = strlen(tag->value);
  66.             if (len1+1+len2 > UINT32_MAX)
  67.                 return AVERROR(EINVAL);
  68.             bytestream_put_le32(p, len1+1+len2);
  69.             bytestream_put_buffer(p, tag->key, len1);
  70.             bytestream_put_byte(p, '=');
  71.             bytestream_put_buffer(p, tag->value, len2);
  72.         }
  73.     } else
  74.         bytestream_put_le32(p, 0);
  75.     return 0;
  76. }
  77.