summaryrefslogtreecommitdiff
path: root/libavformat/srtdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/srtdec.c')
-rw-r--r--libavformat/srtdec.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/libavformat/srtdec.c b/libavformat/srtdec.c
index 056165e311..4f5f0953f8 100644
--- a/libavformat/srtdec.c
+++ b/libavformat/srtdec.c
@@ -47,26 +47,30 @@ static int srt_read_header(AVFormatContext *s)
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;
+ st->codec->codec_id = AV_CODEC_ID_SUBRIP;
return 0;
}
-static int64_t get_pts(const char *buf, int *duration)
+static int64_t get_pts(char **buf, int *duration,
+ int32_t *x1, int32_t *y1, int32_t *x2, int32_t *y2)
{
int i;
for (i=0; i<2; i++) {
int hh1, mm1, ss1, ms1;
int hh2, mm2, ss2, ms2;
- if (sscanf(buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d",
+ if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d"
+ "%*[ ]X1:%u X2:%u Y1:%u Y2:%u",
&hh1, &mm1, &ss1, &ms1,
- &hh2, &mm2, &ss2, &ms2) == 8) {
+ &hh2, &mm2, &ss2, &ms2,
+ x1, x2, y1, y2) >= 8) {
int64_t start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL + ms1;
int64_t end = (hh2*3600LL + mm2*60LL + ss2) * 1000LL + ms2;
*duration = end - start;
+ *buf += strcspn(*buf, "\n") + 1;
return start;
}
- buf += strcspn(buf, "\n") + 1;
+ *buf += strcspn(*buf, "\n") + 1;
}
return AV_NOPTS_VALUE;
}
@@ -87,11 +91,31 @@ static int srt_read_packet(AVFormatContext *s, AVPacket *pkt)
ptr += ff_get_line(s->pb, ptr, sizeof(buffer)+buffer-ptr);
} 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->duration));
+ if (buffer[0]) {
+ int64_t pts;
+ int duration;
+ const char *end = ptr;
+ int32_t x1 = -1, y1 = -1, x2 = -1, y2 = -1;
+
+ ptr = buffer;
+ pts = get_pts(&ptr, &duration, &x1, &y1, &x2, &y2);
+ if (pts != AV_NOPTS_VALUE &&
+ !(res = av_new_packet(pkt, end - ptr))) {
+ memcpy(pkt->data, ptr, pkt->size);
+ pkt->flags |= AV_PKT_FLAG_KEY;
+ pkt->pos = pos;
+ pkt->pts = pkt->dts = pts;
+ pkt->duration = duration;
+ if (x1 != -1) {
+ uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SUBTITLE_POSITION, 16);
+ if (p) {
+ AV_WL32(p, x1);
+ AV_WL32(p + 4, y1);
+ AV_WL32(p + 8, x2);
+ AV_WL32(p + 12, y2);
+ }
+ }
+ }
}
return res;
}