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