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