77 #define MODE_MATROSKAv2 0x01
78 #define MODE_WEBM 0x02
103 #define MAX_SEEKENTRY_SIZE 21
107 #define MAX_CUETRACKPOS_SIZE 22
110 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
144 while ((num+1) >> bytes*7) bytes++;
163 bytes = needed_bytes;
168 num |= 1ULL << bytes*7;
169 for (i = bytes - 1; i >= 0; i--)
177 while (tmp>>=8) bytes++;
181 for (i = bytes - 1; i >= 0; i--)
193 const void *buf,
int size)
250 for (i = 0; i < size / 255; i++)
269 if (new_seekhead ==
NULL)
274 if (numelements > 0) {
349 currentpos = seekhead->
filepos;
399 uint64_t pts = entry->
pts;
406 for (j = 0; j < cues->
num_entries - i && entry[j].
pts == pts; j++) {
424 int first_header_size;
428 first_header_size = 30;
430 first_header_size = 42;
433 first_header_size, header_start, header_len) < 0) {
439 for (j = 0; j < 2; j++) {
442 for (j = 0; j < 3; j++)
443 avio_write(pb, header_start[j], header_len[j]);
466 int ret, codecpriv_size;
482 "Invalid extradata found, ALAC expects a 36-byte "
536 if (ret < 0)
return ret;
547 int output_sample_rate = 0;
587 "Only VP8 video and Vorbis audio are supported for WebM.\n");
609 else if (!native_id) {
632 || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
634 "The specified stereo mode is not valid.\n");
642 if (d_width > INT_MAX) {
667 if (output_sample_rate)
682 av_log(s,
AV_LOG_ERROR,
"Only audio, video, and subtitles are supported for Matroska.\n");
686 if (ret < 0)
return ret;
709 if (ret < 0)
return ret;
748 if ((p = strrchr(p,
'-')) &&
756 else if (*p >=
'a' && *p <=
'z')
781 if (ret < 0)
return ret;
809 if (ret < 0)
return ret;
819 if (ret < 0)
return ret;
829 if (ret < 0)
return ret;
851 if (ret < 0)
return ret;
859 const char *mimetype =
NULL;
886 "it cannot be deduced from the codec id.\n", i);
957 if (ret < 0)
return ret;
964 uint32_t segment_uid[4];
969 for (i = 0; i < 4; i++)
981 AV_WB64(date_utc_buf, date_utc);
992 if (ret < 0)
return ret;
996 if (ret < 0)
return ret;
999 if (ret < 0)
return ret;
1002 if (ret < 0)
return ret;
1023 int size = pkt_size + 4;
1034 int sh, sm, ss, sc, eh, em, es, ec;
1035 uint64_t start,
end;
1037 if (sscanf(p,
"%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
1038 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8)
1040 start = 3600000LL*sh + 60000LL*sm + 1000LL*ss + 10LL*sc;
1041 end = 3600000LL*eh + 60000LL*em + 1000LL*es + 10LL*ec;
1048 int i, layer = 0, max_duration = 0,
size, line_size, data_size = pkt->
size;
1055 max_duration =
FFMAX(duration, max_duration);
1056 end = memchr(data,
'\n', data_size);
1057 size = line_size = end ? end-data+1 : data_size;
1058 size -= end ? (end[-1]==
'\r')+1 : 0;
1060 for (i=0; i<3; i++, start++)
1061 if (!(start = memchr(start,
',',
size-(start-data))))
1062 return max_duration;
1064 sscanf(data,
"Dialogue: %d,", &layer);
1065 i =
snprintf(buffer,
sizeof(buffer),
"%"PRId64
",%d,",
1068 memcpy(buffer+i, start,
size-i);
1071 "pts %" PRId64
", duration %d\n",
1084 data_size -= line_size;
1087 return max_duration;
1100 "pts %" PRId64
", dts %" PRId64
", duration %d, flags %d\n",
1121 if (data != pkt->
data)
1130 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec;
1131 if (sscanf(*buf,
"%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d",
1132 &s_hour, &s_min, &s_sec, &s_hsec,
1133 &e_hour, &e_min, &e_sec, &e_hsec) == 8) {
1134 s_min += 60*s_hour; e_min += 60*e_hour;
1135 s_sec += 60*s_min; e_sec += 60*e_min;
1136 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec;
1137 duration = e_hsec - s_hsec;
1139 *buf += strcspn(*buf,
"\n") + 1;
1226 if (ret < 0)
return ret;
1259 || cluster_size > 5*1024*1024 || ts > mkv->
cluster_pts + 5000
1262 " bytes, pts %" PRIu64
"\n",
avio_tell(pb), ts);
1292 int64_t currentpos, cuespos;
1317 if (ret < 0)
return ret;
1383 #if CONFIG_MATROSKA_MUXER
1387 .mime_type =
"video/x-matroska",
1388 .extensions =
"mkv",
1390 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
1392 .video_codec = CONFIG_LIBX264_ENCODER ?
1408 #if CONFIG_WEBM_MUXER
1412 .mime_type =
"video/webm",
1413 .extensions =
"webm",
1425 #if CONFIG_MATROSKA_AUDIO_MUXER
1429 .mime_type =
"audio/x-matroska",
1430 .extensions =
"mka",
1432 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?