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);