Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * MicroDVD subtitle muxer
  3.  * Copyright (c) 2010  Aurelien Jacobs <aurel@gnuage.org>
  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 <inttypes.h>
  23. #include "avformat.h"
  24. #include "internal.h"
  25.  
  26. static int microdvd_write_header(struct AVFormatContext *s)
  27. {
  28.     AVCodecContext *avctx = s->streams[0]->codec;
  29.     AVRational tb = avctx->time_base;
  30.  
  31.     if (s->nb_streams != 1 || avctx->codec_id != AV_CODEC_ID_MICRODVD) {
  32.         av_log(s, AV_LOG_ERROR, "Exactly one MicroDVD stream is needed.\n");
  33.         return -1;
  34.     }
  35.  
  36.     if (avctx->extradata && avctx->extradata_size > 0) {
  37.         avio_write(s->pb, "{DEFAULT}{}", 11);
  38.         avio_write(s->pb, avctx->extradata, avctx->extradata_size);
  39.         avio_flush(s->pb);
  40.     }
  41.  
  42.     avpriv_set_pts_info(s->streams[0], 64, tb.num, tb.den);
  43.     return 0;
  44. }
  45.  
  46. static int microdvd_write_packet(AVFormatContext *avf, AVPacket *pkt)
  47. {
  48.     avio_printf(avf->pb, "{%"PRId64"}", pkt->pts);
  49.     if (pkt->duration < 0)
  50.         avio_write(avf->pb, "{}", 2);
  51.     else
  52.         avio_printf(avf->pb, "{%"PRId64"}", pkt->pts + pkt->duration);
  53.     avio_write(avf->pb, pkt->data, pkt->size);
  54.     avio_write(avf->pb, "\n", 1);
  55.     return 0;
  56. }
  57.  
  58. AVOutputFormat ff_microdvd_muxer = {
  59.     .name           = "microdvd",
  60.     .long_name      = NULL_IF_CONFIG_SMALL("MicroDVD subtitle format"),
  61.     .mime_type      = "text/x-microdvd",
  62.     .extensions     = "sub",
  63.     .write_header   = microdvd_write_header,
  64.     .write_packet   = microdvd_write_packet,
  65.     .flags          = AVFMT_NOTIMESTAMPS,
  66.     .subtitle_codec = AV_CODEC_ID_MICRODVD,
  67. };
  68.