diff options
Diffstat (limited to 'libavformat/srtdec.c')
-rw-r--r-- | libavformat/srtdec.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/libavformat/srtdec.c b/libavformat/srtdec.c index 9db5133..a66ced3 100644 --- a/libavformat/srtdec.c +++ b/libavformat/srtdec.c @@ -2,20 +2,20 @@ * SubRip subtitle demuxer * Copyright (c) 2010 Aurelien Jacobs <aurel@gnuage.org> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -44,23 +44,30 @@ static int srt_read_header(AVFormatContext *s) { AVStream *st = avformat_new_stream(s, NULL); if (!st) - return -1; + return AVERROR(ENOMEM); avpriv_set_pts_info(st, 64, 1, 1000); st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE; st->codec->codec_id = AV_CODEC_ID_SRT; return 0; } -static int64_t get_pts(const char *buf) +static int64_t get_pts(const char *buf, int *duration) { - int i, v, hour, min, sec, hsec; + int i, hour, min, sec, hsec; + int he, me, se, mse; for (i=0; i<2; i++) { - if (sscanf(buf, "%d:%2d:%2d%*1[,.]%3d --> %*d:%*2d:%*2d%*1[,.]%3d", - &hour, &min, &sec, &hsec, &v) == 5) { + int64_t start, end; + if (sscanf(buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d", + &hour, &min, &sec, &hsec, &he, &me, &se, &mse) == 8) { min += 60*hour; sec += 60*min; - return sec*1000+hsec; + start = sec*1000+hsec; + me += 60*he; + se += 60*me; + end = se*1000+mse; + *duration = end - start; + return start; } buf += strcspn(buf, "\n") + 1; } @@ -81,13 +88,13 @@ static int srt_read_packet(AVFormatContext *s, AVPacket *pkt) do { ptr2 = ptr; ptr += ff_get_line(s->pb, ptr, sizeof(buffer)+buffer-ptr); - } while (!is_eol(*ptr2) && !s->pb->eof_reached && ptr-buffer<sizeof(buffer)-1); + } while (!is_eol(*ptr2) && !url_feof(s->pb) && ptr-buffer<sizeof(buffer)-1); if (buffer[0] && !(res = av_new_packet(pkt, ptr-buffer))) { memcpy(pkt->data, buffer, pkt->size); pkt->flags |= AV_PKT_FLAG_KEY; pkt->pos = pos; - pkt->pts = pkt->dts = get_pts(pkt->data); + pkt->pts = pkt->dts = get_pts(pkt->data, &(pkt->duration)); } return res; } |