Mercurial > libavformat.hg
comparison mxfenc.c @ 4395:2a72b8b7a69d libavformat
write system item
author | bcoudurier |
---|---|
date | Sun, 08 Feb 2009 02:34:56 +0000 |
parents | 87a896580005 |
children | a34ee37a164e |
comparison
equal
deleted
inserted
replaced
4394:830c5cc205b8 | 4395:2a72b8b7a69d |
---|---|
868 int last_key_index = 0, key_index = 0; | 868 int last_key_index = 0, key_index = 0; |
869 | 869 |
870 av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count); | 870 av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count); |
871 | 871 |
872 put_buffer(pb, index_table_segment_key, 16); | 872 put_buffer(pb, index_table_segment_key, 16); |
873 ret = klv_encode_ber_length(pb, 109 + s->nb_streams*6 + | 873 ret = klv_encode_ber_length(pb, 109 + (s->nb_streams+1)*6 + |
874 mxf->edit_units_count*(11+(s->nb_streams-1)*4)); | 874 mxf->edit_units_count*(11+(s->nb_streams-1)*4)); |
875 | 875 |
876 // instance id | 876 // instance id |
877 mxf_write_local_tag(pb, 16, 0x3C0A); | 877 mxf_write_local_tag(pb, 16, 0x3C0A); |
878 mxf_write_uuid(pb, IndexTableSegment, 0); | 878 mxf_write_uuid(pb, IndexTableSegment, 0); |
905 // slice count - 1 | 905 // slice count - 1 |
906 mxf_write_local_tag(pb, 1, 0x3F08); | 906 mxf_write_local_tag(pb, 1, 0x3F08); |
907 put_byte(pb, s->nb_streams-1); | 907 put_byte(pb, s->nb_streams-1); |
908 | 908 |
909 // delta entry array | 909 // delta entry array |
910 mxf_write_local_tag(pb, 8 + s->nb_streams*6, 0x3F09); | 910 mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09); |
911 put_be32(pb, s->nb_streams); // num of entries | 911 put_be32(pb, s->nb_streams+1); // num of entries |
912 put_be32(pb, 6); // size of one entry | 912 put_be32(pb, 6); // size of one entry |
913 // write system item delta entry | |
914 put_byte(pb, 0); | |
915 put_byte(pb, 0); // slice entry | |
916 put_be32(pb, 0); // element delta | |
913 for (i = 0; i < s->nb_streams; i++) { | 917 for (i = 0; i < s->nb_streams; i++) { |
914 AVStream *st = s->streams[i]; | 918 AVStream *st = s->streams[i]; |
915 MXFStreamContext *sc = st->priv_data; | 919 MXFStreamContext *sc = st->priv_data; |
916 put_byte(pb, sc->temporal_reordering); | 920 put_byte(pb, sc->temporal_reordering); |
917 if (sc->temporal_reordering) | 921 if (sc->temporal_reordering) |
918 temporal_reordering = 1; | 922 temporal_reordering = 1; |
919 put_byte(pb, i); | 923 put_byte(pb, i); |
920 put_be32(pb, 0); // element delta | 924 if (mxf->edit_unit_start) |
925 put_be32(pb, KAG_SIZE); // system item size including klv fill | |
926 else | |
927 put_be32(pb, 0); // element delta | |
921 } | 928 } |
922 | 929 |
923 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+(s->nb_streams-1)*4), 0x3F0A); | 930 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+(s->nb_streams-1)*4), 0x3F0A); |
924 put_be32(pb, mxf->edit_units_count); // num of entries | 931 put_be32(pb, mxf->edit_units_count); // num of entries |
925 put_be32(pb, 11+(s->nb_streams-1)*4); // size of one entry | 932 put_be32(pb, 11+(s->nb_streams-1)*4); // size of one entry |
1246 put_byte(s->pb, 0); | 1253 put_byte(s->pb, 0); |
1247 assert(!(url_ftell(s->pb) & (KAG_SIZE-1))); | 1254 assert(!(url_ftell(s->pb) & (KAG_SIZE-1))); |
1248 } | 1255 } |
1249 } | 1256 } |
1250 | 1257 |
1258 static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 }; | |
1259 static const uint8_t system_metadata_package_set_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x43,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x02,0x01 }; | |
1260 | |
1261 static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps) | |
1262 { | |
1263 return (0 << 31) | // color frame flag | |
1264 (0 << 30) | // drop frame flag | |
1265 ( ((frame % fps) / 10) << 28) | // tens of frames | |
1266 ( ((frame % fps) % 10) << 24) | // units of frames | |
1267 (0 << 23) | // field phase (NTSC), b0 (PAL) | |
1268 ((((frame / fps) % 60) / 10) << 20) | // tens of seconds | |
1269 ((((frame / fps) % 60) % 10) << 16) | // units of seconds | |
1270 (0 << 15) | // b0 (NTSC), b2 (PAL) | |
1271 ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes | |
1272 ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes | |
1273 (0 << 7) | // b1 | |
1274 (0 << 6) | // b2 (NSC), field phase (PAL) | |
1275 ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours | |
1276 ( (frame / (fps * 3600) % 24)) % 10; // units of hours | |
1277 } | |
1278 | |
1279 static void mxf_write_system_item(AVFormatContext *s) | |
1280 { | |
1281 MXFContext *mxf = s->priv_data; | |
1282 ByteIOContext *pb = s->pb; | |
1283 unsigned fps, frame; | |
1284 uint32_t time_code; | |
1285 | |
1286 frame = mxf->edit_units_count; | |
1287 | |
1288 // write system metadata pack | |
1289 put_buffer(pb, system_metadata_pack_key, 16); | |
1290 klv_encode_ber_length(pb, 57); | |
1291 put_byte(pb, 0x5c); // UL, user date/time stamp, picture and sound item present | |
1292 put_byte(pb, 0x04); // content package rate | |
1293 put_byte(pb, 0x00); // content package type | |
1294 put_be16(pb, 0x00); // channel handle | |
1295 put_be16(pb, frame); // continuity count | |
1296 if (mxf->essence_container_count > 1) | |
1297 put_buffer(pb, multiple_desc_ul, 16); | |
1298 else | |
1299 put_buffer(pb, mxf_essence_container_uls[mxf->essence_containers_indices[0]].container_ul, 16); | |
1300 put_byte(pb, 0); | |
1301 put_be64(pb, 0); | |
1302 put_be64(pb, 0); // creation date/time stamp | |
1303 | |
1304 // XXX drop frame | |
1305 if (mxf->time_base.den == 30000) fps = 30; | |
1306 else fps = 25; | |
1307 | |
1308 put_byte(pb, 0x81); // SMPTE 12M time code | |
1309 time_code = ff_framenum_to_12m_time_code(frame, 0, fps); | |
1310 put_be32(pb, time_code); | |
1311 put_be32(pb, 0); // binary group data | |
1312 put_be64(pb, 0); | |
1313 | |
1314 // write system metadata package set | |
1315 put_buffer(pb, system_metadata_package_set_key, 16); | |
1316 klv_encode_ber_length(pb, 35); | |
1317 put_byte(pb, 0x83); // UMID | |
1318 put_be16(pb, 0x20); | |
1319 mxf_write_umid(pb, SourcePackage, 0); | |
1320 } | |
1321 | |
1251 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt) | 1322 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt) |
1252 { | 1323 { |
1253 MXFContext *mxf = s->priv_data; | 1324 MXFContext *mxf = s->priv_data; |
1254 ByteIOContext *pb = s->pb; | 1325 ByteIOContext *pb = s->pb; |
1255 AVStream *st = s->streams[pkt->stream_index]; | 1326 AVStream *st = s->streams[pkt->stream_index]; |
1280 mxf_write_klv_fill(s); | 1351 mxf_write_klv_fill(s); |
1281 | 1352 |
1282 if (st->index == mxf->edit_unit_start) { | 1353 if (st->index == mxf->edit_unit_start) { |
1283 mxf->index_entries[mxf->edit_units_count].offset = url_ftell(pb); | 1354 mxf->index_entries[mxf->edit_units_count].offset = url_ftell(pb); |
1284 mxf->index_entries[mxf->edit_units_count].slice_offset[st->index] = 0; | 1355 mxf->index_entries[mxf->edit_units_count].slice_offset[st->index] = 0; |
1356 | |
1357 mxf_write_system_item(s); | |
1358 mxf_write_klv_fill(s); | |
1359 | |
1285 mxf->edit_units_count++; | 1360 mxf->edit_units_count++; |
1286 } else { | 1361 } else { |
1287 mxf->index_entries[mxf->edit_units_count-1].slice_offset[st->index] = | 1362 mxf->index_entries[mxf->edit_units_count-1].slice_offset[st->index] = |
1288 url_ftell(pb) - mxf->index_entries[mxf->edit_units_count-1].offset; | 1363 url_ftell(pb) - mxf->index_entries[mxf->edit_units_count-1].offset; |
1289 } | 1364 } |
1319 static int mxf_write_footer(AVFormatContext *s) | 1394 static int mxf_write_footer(AVFormatContext *s) |
1320 { | 1395 { |
1321 MXFContext *mxf = s->priv_data; | 1396 MXFContext *mxf = s->priv_data; |
1322 ByteIOContext *pb = s->pb; | 1397 ByteIOContext *pb = s->pb; |
1323 unsigned index_byte_count = | 1398 unsigned index_byte_count = |
1324 109 + s->nb_streams*6 + | 1399 109 + (s->nb_streams+1)*6 + |
1325 mxf->edit_units_count*(11+(s->nb_streams-1)*4); | 1400 mxf->edit_units_count*(11+(s->nb_streams-1)*4); |
1326 | 1401 |
1327 // add encoded ber length | 1402 // add encoded ber length |
1328 index_byte_count += 16 + klv_ber_length(index_byte_count); | 1403 index_byte_count += 16 + klv_ber_length(index_byte_count); |
1329 | 1404 |