Mercurial > libavformat.hg
comparison mxf.c @ 1646:52215d40cb3f libavformat
Make seeking work in files that contain encrypted tracks.
author | reimar |
---|---|
date | Sun, 14 Jan 2007 21:23:32 +0000 |
parents | f5a0cd8c23ac |
children | 46d5a151ca4f |
comparison
equal
deleted
inserted
replaced
1645:9aa27a785d1f | 1646:52215d40cb3f |
---|---|
139 int essence_containers_uls_count; | 139 int essence_containers_uls_count; |
140 UID operational_pattern_ul; | 140 UID operational_pattern_ul; |
141 UID content_storage_uid; | 141 UID content_storage_uid; |
142 MXFMetadataSet **metadata_sets; | 142 MXFMetadataSet **metadata_sets; |
143 int metadata_sets_count; | 143 int metadata_sets_count; |
144 uint8_t *sync_key; | |
144 AVFormatContext *fc; | 145 AVFormatContext *fc; |
145 } MXFContext; | 146 } MXFContext; |
146 | 147 |
147 typedef struct KLVPacket { | 148 typedef struct KLVPacket { |
148 UID key; | 149 UID key; |
172 } MXFMetadataReadTableEntry; | 173 } MXFMetadataReadTableEntry; |
173 | 174 |
174 /* partial keys to match */ | 175 /* partial keys to match */ |
175 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; | 176 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; |
176 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 }; | 177 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 }; |
178 /* complete keys to match */ | |
179 static const uint8_t mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 }; | |
177 | 180 |
178 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) | 181 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) |
179 | 182 |
180 #define PRINT_KEY(s, x) dprintf("%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \ | 183 #define PRINT_KEY(s, x) dprintf("%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \ |
181 (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5], (x)[6], (x)[7], (x)[8], (x)[9], (x)[10], (x)[11], (x)[12], (x)[13], (x)[14], (x)[15]) | 184 (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5], (x)[6], (x)[7], (x)[8], (x)[9], (x)[10], (x)[11], (x)[12], (x)[13], (x)[14], (x)[15]) |
246 return 0; | 249 return 0; |
247 } | 250 } |
248 | 251 |
249 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) | 252 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) |
250 { | 253 { |
254 MXFContext *mxf = s->priv_data; | |
251 KLVPacket klv; | 255 KLVPacket klv; |
252 | 256 |
253 while (!url_feof(&s->pb)) { | 257 while (!url_feof(&s->pb)) { |
254 if (klv_read_packet(&klv, &s->pb) < 0) { | 258 if (klv_read_packet(&klv, &s->pb) < 0) { |
255 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); | 259 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); |
256 return -1; | 260 return -1; |
257 } | 261 } |
258 #ifdef DEBUG | 262 #ifdef DEBUG |
259 PRINT_KEY("read packet", klv.key); | 263 PRINT_KEY("read packet", klv.key); |
260 #endif | 264 #endif |
265 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) { | |
266 mxf->sync_key = mxf_encrypted_triplet_key; | |
267 av_log(s, AV_LOG_ERROR, "encrypted triplet not supported\n"); | |
268 return -1; | |
269 } | |
261 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { | 270 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
262 int index = mxf_get_stream_index(s, &klv); | 271 int index = mxf_get_stream_index(s, &klv); |
263 if (index < 0) { | 272 if (index < 0) { |
264 av_log(s, AV_LOG_ERROR, "error getting stream index\n"); | 273 av_log(s, AV_LOG_ERROR, "error getting stream index\n"); |
265 url_fskip(&s->pb, klv.length); | 274 url_fskip(&s->pb, klv.length); |
854 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) | 863 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
855 { | 864 { |
856 MXFContext *mxf = s->priv_data; | 865 MXFContext *mxf = s->priv_data; |
857 KLVPacket klv; | 866 KLVPacket klv; |
858 | 867 |
868 mxf->sync_key = mxf_essence_element_key; | |
859 if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) { | 869 if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) { |
860 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); | 870 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); |
861 return -1; | 871 return -1; |
862 } | 872 } |
863 url_fseek(&s->pb, -14, SEEK_CUR); | 873 url_fseek(&s->pb, -14, SEEK_CUR); |
940 | 950 |
941 /* rudimentary binary seek */ | 951 /* rudimentary binary seek */ |
942 /* XXX: use MXF Index */ | 952 /* XXX: use MXF Index */ |
943 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) | 953 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) |
944 { | 954 { |
955 MXFContext *mxf = s->priv_data; | |
945 AVStream *st = s->streams[stream_index]; | 956 AVStream *st = s->streams[stream_index]; |
946 int64_t seconds; | 957 int64_t seconds; |
947 | 958 |
948 if (!s->bit_rate) | 959 if (!s->bit_rate) |
949 return -1; | 960 return -1; |
950 if (sample_time < 0) | 961 if (sample_time < 0) |
951 sample_time = 0; | 962 sample_time = 0; |
952 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den); | 963 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den); |
953 url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); | 964 url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); |
954 if (!mxf_read_sync(&s->pb, mxf_essence_element_key, 12)) | 965 if (!mxf_read_sync(&s->pb, mxf->sync_key, 12)) |
955 return -1; | 966 return -1; |
956 | 967 |
957 /* found KLV key */ | 968 /* found KLV key */ |
958 url_fseek(&s->pb, -12, SEEK_CUR); | 969 url_fseek(&s->pb, -12, SEEK_CUR); |
959 av_update_cur_dts(s, st, sample_time); | 970 av_update_cur_dts(s, st, sample_time); |