/*
-Copyright (c) 2003-2015, John Hurst
+Copyright (c) 2003-2018
+, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
{
fprintf(stream, "\n\
%s (asdcplib %s)\n\n\
-Copyright (c) 2003-2015 John Hurst\n\n\
+Copyright (c) 2003-2018 John Hurst\n\n\
asdcplib may be copied only under the terms of the license found at\n\
the top of every file in the asdcplib distribution kit.\n\n\
Specify the -h (help) option for further information about %s\n\n",
fprintf(stream, "\
Options:\n\
+ -h | -help - Show help\n\
+ -V - Show version information\n\
-3 - Create a stereoscopic image file. Expects two\n\
directories of JP2K codestreams (directories must have\n\
an equal number of frames; the left eye is first)\n\
+ -a <UUID> - Specify the Asset ID of the file\n\
-A <UL> - Set DataEssenceCoding UL value in an Aux Data file\n\
+ -b <buffer-size> - Specify size in bytes of picture frame buffer\n\
+ Defaults to 4,194,304 (4MB)\n\
-C <UL> - Set ChannelAssignment UL value in a PCM file\n\
- -h | -help - Show help\n\
- -V - Show version information\n\
+ -d <duration> - Number of frames to process, default all\n\
-e - Encrypt MPEG or JP2K headers (default)\n\
-E - Do not encrypt MPEG or JP2K headers\n\
+ -f <start-frame> - Starting frame number, default 0\n\
+ -g <rfc-5646-code>\n\
+ - Create MCA labels having the given RFC 5646 language code\n\
+ (requires option \"-m\")\n\
-j <key-id-str> - Write key ID instead of creating a random value\n\
-k <key-string> - Use key for ciphertext operations\n\
- -M - Do not create HMAC values when writing\n\
- -m <expr> - Write MCA labels using <expr>. Example:\n\
- 51(L,R,C,LFE,Ls,Rs,),HI,VIN\n\
- Note: The symbol '-' may be used for an unlabeled\n\
- channel, but not within a soundfield.\n\
- -a <UUID> - Specify the Asset ID of the file\n\
- -b <buffer-size> - Specify size in bytes of picture frame buffer\n\
- Defaults to 4,194,304 (4MB)\n\
- -d <duration> - Number of frames to process, default all\n\
- -f <start-frame> - Starting frame number, default 0\n\
-l <label> - Use given channel format label when writing MXF sound\n\
files. SMPTE 429-2 labels: '5.1', '6.1', '7.1',\n\
'7.1DS', 'WTF'\n\
Default is no label (valid for Interop only).\n\
-L - Write SMPTE UL values instead of MXF Interop\n\
- -P <UL> - Set PictureEssenceCoding UL value in a JP2K file\n\
+ -m <expr> - Write MCA labels using <expr>. Example:\n\
+ 51(L,R,C,LFE,Ls,Rs,),HI,VIN\n\
+ Note: The symbol '-' may be used for an unlabeled\n\
+ channel, but not within a soundfield.\n\
+ -M - Do not create HMAC values when writing\n\
-p <rate> - fps of picture when wrapping PCM or JP2K:\n\
Use one of [23|24|25|30|48|50|60], 24 is default\n\
+ -P <UL> - Set PictureEssenceCoding UL value in a JP2K file\n\
-s - Insert a Dolby Atmos synchronization channel when\n\
wrapping PCM. This implies a -L option(SMPTE ULs) and \n\
will overide -C and -l options with Configuration 4 \n\
Channel Assigment and no format label respectively. \n\
-v - Verbose, prints informative messages to stderr\n\
- -W - Read input file only, do not write source file\n\
+ -w - When writing 377-4 MCA labels, use the WTF Channel\n\
+ assignment label instead of the standard MCA label\n\
+ -W - Read input file only, do not write output file\n\
-z - Fail if j2c inputs have unequal parameters (default)\n\
-Z - Ignore unequal parameters in j2c inputs\n\
\n\
UL picture_coding;
UL aux_data_coding;
bool dolby_atmos_sync_flag; // if true, insert a Dolby Atmos Synchronization channel.
- ui32_t ffoa; /// first frame of action for atmos wrapping
- ui32_t max_channel_count; /// max channel count for atmos wrapping
- ui32_t max_object_count; /// max object count for atmos wrapping
+ ui32_t ffoa; // first frame of action for atmos wrapping
+ ui32_t max_channel_count; // max channel count for atmos wrapping
+ ui32_t max_object_count; // max object count for atmos wrapping
+ bool use_interop_sound_wtf; // make true to force WTF assignment label instead of MCA
ASDCP::MXF::ASDCP_MCAConfigParser mca_config;
+ std::string mca_language;
//
Rational PictureRate()
if ( picture_rate == 96 ) return EditRate_96;
if ( picture_rate == 100 ) return EditRate_100;
if ( picture_rate == 120 ) return EditRate_120;
+ if ( picture_rate == 192 ) return EditRate_192;
+ if ( picture_rate == 200 ) return EditRate_200;
+ if ( picture_rate == 240 ) return EditRate_240;
return EditRate_24;
}
if ( picture_rate == 96 ) return "96";
if ( picture_rate == 100 ) return "100";
if ( picture_rate == 120 ) return "120";
+ if ( picture_rate == 192 ) return "192";
+ if ( picture_rate == 200 ) return "200";
+ if ( picture_rate == 240 ) return "240";
return "24";
}
ffoa(0), max_channel_count(10), max_object_count(118), // hard-coded sample atmos properties
dolby_atmos_sync_flag(false),
show_ul_values_flag(false),
- mca_config(g_dict)
+ mca_config(g_dict),
+ use_interop_sound_wtf(false)
{
memset(key_value, 0, KeyLen);
memset(key_id_value, 0, UUIDlen);
+ std::string mca_config_str;
for ( int i = 1; i < argc; i++ )
{
case 'b':
TEST_EXTRA_ARG(i, 'b');
- fb_size = abs(atoi(argv[i]));
+ fb_size = Kumu::xabs(strtol(argv[i], 0, 10));
if ( verbose_flag )
fprintf(stderr, "Frame Buffer size: %u bytes.\n", fb_size);
case 'd':
TEST_EXTRA_ARG(i, 'd');
- duration = abs(atoi(argv[i]));
+ duration = Kumu::xabs(strtol(argv[i], 0, 10));
break;
case 'E': encrypt_header_flag = false; break;
case 'f':
TEST_EXTRA_ARG(i, 'f');
- start_frame = abs(atoi(argv[i]));
+ start_frame = Kumu::xabs(strtol(argv[i], 0, 10));
+ break;
+
+ case 'g':
+ TEST_EXTRA_ARG(i, 'g');
+ mca_language = argv[i];
break;
- case 'g': write_partial_pcm_flag = true; break;
case 'h': help_flag = true; break;
case 'j': key_id_flag = true;
case 'm':
TEST_EXTRA_ARG(i, 'm');
- if ( ! mca_config.DecodeString(argv[i]) )
- {
- return;
- }
+ mca_config_str = argv[i];
break;
case 'P':
case 'p':
TEST_EXTRA_ARG(i, 'p');
- picture_rate = abs(atoi(argv[i]));
+ picture_rate = Kumu::xabs(strtol(argv[i], 0, 10));
break;
case 's': dolby_atmos_sync_flag = true; break;
case 'u': show_ul_values_flag = true; break;
case 'V': version_flag = true; break;
case 'v': verbose_flag = true; break;
+ case 'w': use_interop_sound_wtf = true; break;
case 'W': no_write_flag = true; break;
+ case 'x': write_partial_pcm_flag = true; break;
case 'Z': j2c_pedantic = false; break;
case 'z': j2c_pedantic = true; break;
}
}
+ if ( ! mca_config_str.empty() )
+ {
+ if ( mca_language.empty() )
+ {
+ if ( ! mca_config.DecodeString(mca_config_str) )
+ {
+ return;
+ }
+ }
+ else
+ {
+ if ( ! mca_config.DecodeString(mca_config_str, mca_language) )
+ {
+ return;
+ }
+ }
+ }
+
if ( help_flag || version_flag )
- return;
+ {
+ return;
+ }
if ( filenames.size() < 2 )
{
check_phfr_params(CommandOptions& Options, JP2K::PictureDescriptor& PDesc)
{
Rational rate = Options.PictureRate();
- if ( rate != EditRate_96 && rate != EditRate_100 && rate != EditRate_120 )
+ if ( rate != EditRate_96 && rate != EditRate_100 && rate != EditRate_120
+ && rate != EditRate_192 && rate != EditRate_200 && rate != EditRate_240 )
return true;
if ( PDesc.StoredWidth > 2048 )
return RESULT_FAIL;
}
- essence_descriptor->ChannelAssignment = g_dict->ul(MDD_DCAudioChannelCfg_MCA);
+ if ( Options.channel_assignment.HasValue() )
+ {
+ essence_descriptor->ChannelAssignment = Options.channel_assignment;
+ }
+ else if ( Options.use_interop_sound_wtf )
+ {
+ essence_descriptor->ChannelAssignment = g_dict->ul(MDD_DCAudioChannelCfg_4_WTF);
+ }
+ else
+ {
+ essence_descriptor->ChannelAssignment = g_dict->ul(MDD_DCAudioChannelCfg_MCA);
+ }
// add descriptors to the essence_descriptor and header
ASDCP::MXF::InterchangeObject_list_t::iterator i;
// set up MXF writer
if ( ASDCP_SUCCESS(result) )
{
+ if ( Mixer.ChannelCount() % 2 != 0 )
+ {
+ result = Mixer.AppendSilenceChannels(1);
+ }
+
Mixer.FillAudioDescriptor(ADesc);
ADesc.EditRate = PictureRate;
case ESS_DCDATA_UNKNOWN:
if ( ! Options.aux_data_coding.HasValue() )
{
- fprintf(stderr, "Option \"-A <UL>\" is required for Aux Data essence.\n",
- Options.filenames.front().c_str());
+ fprintf(stderr, "Option \"-A <UL>\" is required for Aux Data essence.\n");
return 3;
}
else