Mercurial > libavformat.hg
comparison matroskaenc.c @ 6315:8a971c824cdc libavformat
matroskaenc: add support for muxing SRT tracks
author | aurel |
---|---|
date | Sun, 25 Jul 2010 21:16:58 +0000 |
parents | 7b2f50760dfb |
children |
comparison
equal
deleted
inserted
replaced
6314:d907dafa4c5d | 6315:8a971c824cdc |
---|---|
869 put_buffer(pb, data, size); | 869 put_buffer(pb, data, size); |
870 if (data != pkt->data) | 870 if (data != pkt->data) |
871 av_free(data); | 871 av_free(data); |
872 } | 872 } |
873 | 873 |
874 static int srt_get_duration(uint8_t **buf) | |
875 { | |
876 int i, duration = 0; | |
877 | |
878 for (i=0; i<2 && !duration; i++) { | |
879 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec; | |
880 if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d", | |
881 &s_hour, &s_min, &s_sec, &s_hsec, | |
882 &e_hour, &e_min, &e_sec, &e_hsec) == 8) { | |
883 s_min += 60*s_hour; e_min += 60*e_hour; | |
884 s_sec += 60*s_min; e_sec += 60*e_min; | |
885 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec; | |
886 duration = e_hsec - s_hsec; | |
887 } | |
888 *buf += strcspn(*buf, "\n") + 1; | |
889 } | |
890 return duration; | |
891 } | |
892 | |
893 static int mkv_write_srt_blocks(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt) | |
894 { | |
895 ebml_master blockgroup; | |
896 AVPacket pkt2 = *pkt; | |
897 int64_t duration = srt_get_duration(&pkt2.data); | |
898 pkt2.size -= pkt2.data - pkt->data; | |
899 | |
900 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, | |
901 mkv_blockgroup_size(pkt2.size)); | |
902 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, &pkt2, 0); | |
903 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); | |
904 end_ebml_master(pb, blockgroup); | |
905 | |
906 return duration; | |
907 } | |
908 | |
874 static void mkv_flush_dynbuf(AVFormatContext *s) | 909 static void mkv_flush_dynbuf(AVFormatContext *s) |
875 { | 910 { |
876 MatroskaMuxContext *mkv = s->priv_data; | 911 MatroskaMuxContext *mkv = s->priv_data; |
877 int bufsize; | 912 int bufsize; |
878 uint8_t *dyn_buf; | 913 uint8_t *dyn_buf; |
916 | 951 |
917 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) { | 952 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) { |
918 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); | 953 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); |
919 } else if (codec->codec_id == CODEC_ID_SSA) { | 954 } else if (codec->codec_id == CODEC_ID_SSA) { |
920 duration = mkv_write_ass_blocks(s, pb, pkt); | 955 duration = mkv_write_ass_blocks(s, pb, pkt); |
956 } else if (codec->codec_id == CODEC_ID_SRT) { | |
957 duration = mkv_write_srt_blocks(s, pb, pkt); | |
921 } else { | 958 } else { |
922 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size)); | 959 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size)); |
923 duration = pkt->convergence_duration; | 960 duration = pkt->convergence_duration; |
924 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0); | 961 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0); |
925 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); | 962 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); |