OLD | NEW |
1 /* | 1 /* |
2 * Matroska file demuxer | 2 * Matroska file demuxer |
3 * Copyright (c) 2003-2008 The FFmpeg Project | 3 * Copyright (c) 2003-2008 The FFmpeg Project |
4 * | 4 * |
5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
6 * | 6 * |
7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 char *language; | 136 char *language; |
137 double time_scale; | 137 double time_scale; |
138 uint64_t default_duration; | 138 uint64_t default_duration; |
139 uint64_t flag_default; | 139 uint64_t flag_default; |
140 MatroskaTrackVideo video; | 140 MatroskaTrackVideo video; |
141 MatroskaTrackAudio audio; | 141 MatroskaTrackAudio audio; |
142 EbmlList encodings; | 142 EbmlList encodings; |
143 | 143 |
144 AVStream *stream; | 144 AVStream *stream; |
145 int64_t end_timecode; | 145 int64_t end_timecode; |
| 146 int ms_compat; |
146 } MatroskaTrack; | 147 } MatroskaTrack; |
147 | 148 |
148 typedef struct { | 149 typedef struct { |
149 uint64_t uid; | 150 uint64_t uid; |
150 char *filename; | 151 char *filename; |
151 char *mime; | 152 char *mime; |
152 EbmlBin bin; | 153 EbmlBin bin; |
153 | 154 |
154 AVStream *stream; | 155 AVStream *stream; |
155 } MatroskaAttachement; | 156 } MatroskaAttachement; |
(...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 } | 1238 } |
1238 } | 1239 } |
1239 | 1240 |
1240 st = track->stream = av_new_stream(s, 0); | 1241 st = track->stream = av_new_stream(s, 0); |
1241 if (st == NULL) | 1242 if (st == NULL) |
1242 return AVERROR(ENOMEM); | 1243 return AVERROR(ENOMEM); |
1243 | 1244 |
1244 if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") | 1245 if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") |
1245 && track->codec_priv.size >= 40 | 1246 && track->codec_priv.size >= 40 |
1246 && track->codec_priv.data != NULL) { | 1247 && track->codec_priv.data != NULL) { |
| 1248 track->ms_compat = 1; |
1247 track->video.fourcc = AV_RL32(track->codec_priv.data + 16); | 1249 track->video.fourcc = AV_RL32(track->codec_priv.data + 16); |
1248 codec_id = ff_codec_get_id(ff_codec_bmp_tags, track->video.fourcc); | 1250 codec_id = ff_codec_get_id(ff_codec_bmp_tags, track->video.fourcc); |
1249 extradata_offset = 40; | 1251 extradata_offset = 40; |
1250 } else if (!strcmp(track->codec_id, "A_MS/ACM") | 1252 } else if (!strcmp(track->codec_id, "A_MS/ACM") |
1251 && track->codec_priv.size >= 14 | 1253 && track->codec_priv.size >= 14 |
1252 && track->codec_priv.data != NULL) { | 1254 && track->codec_priv.data != NULL) { |
1253 init_put_byte(&b, track->codec_priv.data, track->codec_priv.size, | 1255 init_put_byte(&b, track->codec_priv.data, track->codec_priv.size, |
1254 URL_RDONLY, NULL, NULL, NULL, NULL); | 1256 URL_RDONLY, NULL, NULL, NULL, NULL); |
1255 ff_get_wav_header(&b, st->codec, track->codec_priv.size); | 1257 ff_get_wav_header(&b, st->codec, track->codec_priv.size); |
1256 codec_id = st->codec->codec_id; | 1258 codec_id = st->codec->codec_id; |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 + a * (h*w / a - track->audio.pkt_cnt--), a); | 1669 + a * (h*w / a - track->audio.pkt_cnt--), a); |
1668 pkt->pos = pos; | 1670 pkt->pos = pos; |
1669 pkt->stream_index = st->index; | 1671 pkt->stream_index = st->index; |
1670 dynarray_add(&matroska->packets,&matroska->num_packets,pkt); | 1672 dynarray_add(&matroska->packets,&matroska->num_packets,pkt); |
1671 } | 1673 } |
1672 } else { | 1674 } else { |
1673 MatroskaTrackEncoding *encodings = track->encodings.elem; | 1675 MatroskaTrackEncoding *encodings = track->encodings.elem; |
1674 int offset = 0, pkt_size = lace_size[n]; | 1676 int offset = 0, pkt_size = lace_size[n]; |
1675 uint8_t *pkt_data = data; | 1677 uint8_t *pkt_data = data; |
1676 | 1678 |
| 1679 if (lace_size[n] > size) { |
| 1680 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid packet size\n")
; |
| 1681 break; |
| 1682 } |
| 1683 |
1677 if (encodings && encodings->scope & 1) { | 1684 if (encodings && encodings->scope & 1) { |
1678 offset = matroska_decode_buffer(&pkt_data,&pkt_size, track); | 1685 offset = matroska_decode_buffer(&pkt_data,&pkt_size, track); |
1679 if (offset < 0) | 1686 if (offset < 0) |
1680 continue; | 1687 continue; |
1681 } | 1688 } |
1682 | 1689 |
1683 pkt = av_mallocz(sizeof(AVPacket)); | 1690 pkt = av_mallocz(sizeof(AVPacket)); |
1684 /* XXX: prevent data copy... */ | 1691 /* XXX: prevent data copy... */ |
1685 if (av_new_packet(pkt, pkt_size+offset) < 0) { | 1692 if (av_new_packet(pkt, pkt_size+offset) < 0) { |
1686 av_free(pkt); | 1693 av_free(pkt); |
1687 res = AVERROR(ENOMEM); | 1694 res = AVERROR(ENOMEM); |
1688 break; | 1695 break; |
1689 } | 1696 } |
1690 if (offset) | 1697 if (offset) |
1691 memcpy (pkt->data, encodings->compression.settings.data, off
set); | 1698 memcpy (pkt->data, encodings->compression.settings.data, off
set); |
1692 memcpy (pkt->data+offset, pkt_data, pkt_size); | 1699 memcpy (pkt->data+offset, pkt_data, pkt_size); |
1693 | 1700 |
1694 if (pkt_data != data) | 1701 if (pkt_data != data) |
1695 av_free(pkt_data); | 1702 av_free(pkt_data); |
1696 | 1703 |
1697 if (n == 0) | 1704 if (n == 0) |
1698 pkt->flags = is_keyframe; | 1705 pkt->flags = is_keyframe; |
1699 pkt->stream_index = st->index; | 1706 pkt->stream_index = st->index; |
1700 | 1707 |
1701 pkt->pts = timecode; | 1708 if (track->ms_compat) |
| 1709 pkt->dts = timecode; |
| 1710 else |
| 1711 pkt->pts = timecode; |
1702 pkt->pos = pos; | 1712 pkt->pos = pos; |
1703 if (st->codec->codec_id == CODEC_ID_TEXT) | 1713 if (st->codec->codec_id == CODEC_ID_TEXT) |
1704 pkt->convergence_duration = duration; | 1714 pkt->convergence_duration = duration; |
1705 else if (track->type != MATROSKA_TRACK_TYPE_SUBTITLE) | 1715 else if (track->type != MATROSKA_TRACK_TYPE_SUBTITLE) |
1706 pkt->duration = duration; | 1716 pkt->duration = duration; |
1707 | 1717 |
1708 if (st->codec->codec_id == CODEC_ID_SSA) | 1718 if (st->codec->codec_id == CODEC_ID_SSA) |
1709 matroska_fix_ass_packet(matroska, pkt, duration); | 1719 matroska_fix_ass_packet(matroska, pkt, duration); |
1710 | 1720 |
1711 if (matroska->prev_pkt && | 1721 if (matroska->prev_pkt && |
1712 timecode != AV_NOPTS_VALUE && | 1722 timecode != AV_NOPTS_VALUE && |
1713 matroska->prev_pkt->pts == timecode && | 1723 matroska->prev_pkt->pts == timecode && |
1714 matroska->prev_pkt->stream_index == st->index) | 1724 matroska->prev_pkt->stream_index == st->index) |
1715 matroska_merge_packets(matroska->prev_pkt, pkt); | 1725 matroska_merge_packets(matroska->prev_pkt, pkt); |
1716 else { | 1726 else { |
1717 dynarray_add(&matroska->packets,&matroska->num_packets,pkt); | 1727 dynarray_add(&matroska->packets,&matroska->num_packets,pkt); |
1718 matroska->prev_pkt = pkt; | 1728 matroska->prev_pkt = pkt; |
1719 } | 1729 } |
1720 } | 1730 } |
1721 | 1731 |
1722 if (timecode != AV_NOPTS_VALUE) | 1732 if (timecode != AV_NOPTS_VALUE) |
1723 timecode = duration ? timecode + duration : AV_NOPTS_VALUE; | 1733 timecode = duration ? timecode + duration : AV_NOPTS_VALUE; |
1724 data += lace_size[n]; | 1734 data += lace_size[n]; |
| 1735 size -= lace_size[n]; |
1725 } | 1736 } |
1726 } | 1737 } |
1727 | 1738 |
1728 av_free(lace_size); | 1739 av_free(lace_size); |
1729 return res; | 1740 return res; |
1730 } | 1741 } |
1731 | 1742 |
1732 static int matroska_parse_cluster(MatroskaDemuxContext *matroska) | 1743 static int matroska_parse_cluster(MatroskaDemuxContext *matroska) |
1733 { | 1744 { |
1734 MatroskaCluster cluster = { 0 }; | 1745 MatroskaCluster cluster = { 0 }; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1841 "matroska", | 1852 "matroska", |
1842 NULL_IF_CONFIG_SMALL("Matroska file format"), | 1853 NULL_IF_CONFIG_SMALL("Matroska file format"), |
1843 sizeof(MatroskaDemuxContext), | 1854 sizeof(MatroskaDemuxContext), |
1844 matroska_probe, | 1855 matroska_probe, |
1845 matroska_read_header, | 1856 matroska_read_header, |
1846 matroska_read_packet, | 1857 matroska_read_packet, |
1847 matroska_read_close, | 1858 matroska_read_close, |
1848 matroska_read_seek, | 1859 matroska_read_seek, |
1849 .metadata_conv = ff_mkv_metadata_conv, | 1860 .metadata_conv = ff_mkv_metadata_conv, |
1850 }; | 1861 }; |
OLD | NEW |