/*
-Copyright (c) 2011-2016, John Hurst
+Copyright (c) 2011-2018, John Hurst
All rights reserved.
} // end namespace PHDR
- namespace PIDM
- {
- //
- class MXFWriter
- {
- class h__Writer;
- ASDCP::mem_ptr<h__Writer> m_Writer;
- ASDCP_NO_COPY_CONSTRUCT(MXFWriter);
-
- public:
- MXFWriter();
- virtual ~MXFWriter();
-
- // Warning: direct manipulation of MXF structures can interfere
- // with the normal operation of the wrapper. Caveat emptor!
- virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
- virtual ASDCP::MXF::RIP& RIP();
-
- // Open the file for writing. The file must not exist. Returns error if
- // the operation cannot be completed or if nonsensical data is discovered
- // in the essence descriptor.
- Result_t OpenWrite(const std::string& filename, const ASDCP::WriterInfo&,
- const ASDCP::UL& data_essence_coding,
- const ASDCP::Rational& edit_rate, const ui32_t& header_size = 16384,
- const IndexStrategy_t& strategy = IS_FOLLOW, const ui32_t& partition_space = 10);
-
- // Writes a frame of essence to the MXF file. If the optional AESEncContext
- // argument is present, the essence is encrypted prior to writing.
- // Fails if the file is not open, is finalized, or an operating system
- // error occurs.
- Result_t WriteFrame(const ASDCP::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0);
-
- // Closes the MXF file, writing the index and revised header. No global metadata block is written.
- Result_t Finalize();
-
- // Closes the MXF file, writing the global metadata block and then final index and revised header.
- Result_t Finalize(const ASDCP::FrameBuffer& global_metadata);
- };
-
- //
- class MXFReader
- {
- class h__Reader;
- ASDCP::mem_ptr<h__Reader> m_Reader;
- ASDCP_NO_COPY_CONSTRUCT(MXFReader);
-
- public:
- MXFReader();
- virtual ~MXFReader();
-
- // Warning: direct manipulation of MXF structures can interfere
- // with the normal operation of the wrapper. Caveat emptor!
- virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
- virtual AS_02::MXF::AS02IndexReader& AS02IndexReader();
- virtual ASDCP::MXF::RIP& RIP();
-
- // Open the file for reading. The file must exist. Returns error if the
- // operation cannot be completed.
- Result_t OpenRead(const std::string& filename) const;
-
- // Open the file for reading. The file must exist. Returns error if the
- // operation cannot be completed. If global metadata is available it will
- // be placed into the buffer object passed as the second argument.
- Result_t OpenRead(const std::string& filename, ASDCP::FrameBuffer& global_metadata) const;
-
- // Returns RESULT_INIT if the file is not open.
- Result_t Close() const;
-
- // Fill a WriterInfo struct with the values from the file's header.
- // Returns RESULT_INIT if the file is not open.
- Result_t FillWriterInfo(ASDCP::WriterInfo&) const;
-
- // Reads a frame of essence from the MXF file. If the optional AESEncContext
- // argument is present, the essence is decrypted after reading. If the MXF
- // file is encrypted and the AESDecContext argument is NULL, the frame buffer
- // will contain the ciphertext frame data. If the HMACContext argument is
- // not NULL, the HMAC will be calculated (if the file supports it).
- // Returns RESULT_INIT if the file is not open, failure if the frame number is
- // out of range, or if optional decrypt or HAMC operations fail.
- Result_t ReadFrame(ui32_t frame_number, ASDCP::FrameBuffer&, ASDCP::AESDecContext* = 0, ASDCP::HMACContext* = 0) const;
-
- // Print debugging information to stream
- void DumpHeaderMetadata(FILE* = 0) const;
- void DumpIndex(FILE* = 0) const;
- };
-
- }
-
} // end namespace AS_02
#endif // _AS_02_PHDR_H_
/*
-Copyright (c) 2005-2016, John Hurst
+Copyright (c) 2005-2018, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
const MDDEntry* FindULExact(const byte_t*) const;
const MDDEntry* FindSymbol(const std::string&) const;
const MDDEntry& Type(MDD_t type_id) const;
+ MDDEntry& MutableType(MDD_t type_id);
inline const byte_t* ul(MDD_t type_id) const {
return Type(type_id).ul;
};
+ const Dictionary& AtmosSMPTEDict();
const Dictionary& DefaultSMPTEDict();
const Dictionary& DefaultInteropDict();
const Dictionary& DefaultCompositeDict();
libphdr_la_SOURCES = \
AS_02_PHDR.h \
PHDR_Sequence_Parser.cpp \
- AS_02_PHDR.cpp \
- AS_02_PIDM.cpp
+ AS_02_PHDR.cpp
libphdr_la_LDFLAGS = -release @VERSION@
libphdr_la_LIBADD = libasdcp.la libkumu.la
/*
-Copyright (c) 2011-2014, John Hurst
+Copyright (c) 2011-2018, John Hurst
All rights reserved.
{
fprintf(stream, "\n\
%s (asdcplib %s)\n\n\
-Copyright (c) 2011-2015, John Hurst\n\n\
+Copyright (c) 2011-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",
return result;
}
-
-// Read one or more plaintext DCData bytestreams from a plaintext ASDCP file
-// Read one or more plaintext DCData bytestreams from a ciphertext ASDCP file
-// Read one or more ciphertext DCData byestreams from a ciphertext ASDCP file
-//
-Result_t
-read_aux_data_file(CommandOptions& Options)
-{
- AESDecContext* Context = 0;
- HMACContext* HMAC = 0;
- AS_02::PIDM::MXFReader Reader;
- DCData::FrameBuffer FrameBuffer(Options.fb_size);
- ui32_t frame_count = 0;
-
- ASDCP::FrameBuffer global_metadata;
- Result_t result = Reader.OpenRead(Options.input_filename, global_metadata);
-
- if ( ASDCP_SUCCESS(result)
- && global_metadata.Size()
- && ! Options.global_metadata_filename.empty() )
- {
- ui32_t write_count = 0;
- Kumu::FileWriter Writer;
-
- result = Writer.OpenWrite(Options.global_metadata_filename);
-
- if ( ASDCP_SUCCESS(result) )
- {
- result = Writer.Write(global_metadata.RoData(), global_metadata.Size(), &write_count);
- }
-
- if ( ASDCP_SUCCESS(result) && global_metadata.Size() != write_count)
- {
- return RESULT_WRITEFAIL;
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- frame_count = Reader.AS02IndexReader().GetDuration();
-
- if ( Options.verbose_flag )
- {
- fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
- }
- }
-
- if ( ASDCP_SUCCESS(result) && Options.key_flag )
- {
- Context = new AESDecContext;
- result = Context->InitKey(Options.key_value);
-
- if ( ASDCP_SUCCESS(result) && Options.read_hmac )
- {
- WriterInfo Info;
- Reader.FillWriterInfo(Info);
-
- if ( Info.UsesHMAC )
- {
- HMAC = new HMACContext;
- result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
- }
- else
- {
- fputs("File does not contain HMAC values, ignoring -m option.\n", stderr);
- }
- }
- }
-
- ui32_t last_frame = Options.start_frame + ( Options.duration ? Options.duration : frame_count);
- if ( last_frame > frame_count )
- last_frame = frame_count;
-
- char name_format[64];
- snprintf(name_format, 64, "%%s%%0%du.%s", Options.number_width, Options.extension);
-
- for ( ui32_t i = Options.start_frame; ASDCP_SUCCESS(result) && i < last_frame; i++ )
- {
- result = Reader.ReadFrame(i, FrameBuffer, Context, HMAC);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( ! Options.no_write_flag )
- {
- Kumu::FileWriter OutFile;
- char filename[256];
- ui32_t write_count;
- snprintf(filename, 256, name_format, Options.file_prefix, i);
- result = OutFile.OpenWrite(filename);
-
- if ( ASDCP_SUCCESS(result) )
- result = OutFile.Write(FrameBuffer.Data(), FrameBuffer.Size(), &write_count);
- }
-
- if ( Options.verbose_flag )
- FrameBuffer.Dump(stderr, Options.fb_dump_size);
- }
- }
-
- return result;
-}
-
-
//
int
main(int argc, const char** argv)
result = read_JP2K_file(Options);
break;
- case ESS_DCDATA_UNKNOWN:
- result = read_aux_data_file(Options);
- break;
-
default:
fprintf(stderr, "%s: Unknown file type, not P-HDR essence.\n", Options.input_filename);
return 5;
/*
-Copyright (c) 2011-2016, John Hurst
+Copyright (c) 2011-2018, John Hurst
All rights reserved.
{
fprintf(stream, "\n\
%s (asdcplib %s)\n\n\
-Copyright (c) 2011-2015, John Hurst\n\n\
+Copyright (c) 2011-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",
-e - Encrypt JP2K headers (default)\n\
-E - Do not encrypt JP2K headers\n\
-F (0|1) - Set field dominance for interlaced image (default: 0)\n\
- -g <filename> - Write global metadata from the named PIDM file.\n\
-i - Indicates input essence is interlaced fields (forces -Y)\n\
-j <key-id-str> - Write key ID instead of creating a random value\n\
-k <key-string> - Use key for ciphertext operations\n\
-t <min> - Set RGB component minimum code value (default: 0)\n\
-T <max> - Set RGB component maximum code value (default: 1023)\n\
-u - Print UL catalog to stderr\n\
- -U <UL> - Set DataEssenceCoding UL value in an Aux Data file\n\
-v - Verbose, prints informative messages to stderr\n\
-W - Read input file only, do not write source file\n\
-x <int> - Horizontal subsampling degree (default: 2)\n\
ui32_t partition_space; //Shim parameter partition_spacing
std::string PHDR_master_metadata;
- UL aux_data_coding;
std::string global_metadata_filename;
//
break;
case 'u': show_ul_values_flag = true; break;
-
- case 'U':
- TEST_EXTRA_ARG(i, 'U');
- if ( ! aux_data_coding.DecodeHex(argv[i]) )
- {
- fprintf(stderr, "Error decoding UL value: %s\n", argv[i]);
- return;
- }
- break;
-
case 'V': version_flag = true; break;
case 'v': verbose_flag = true; break;
case 'W': no_write_flag = true; break;
}
-
-// Write one or more plaintext Aux Data bytestreams to a plaintext AS-02 file
-// Write one or more plaintext Aux Data bytestreams to a ciphertext AS-02 file
-//
-Result_t
-write_aux_data_file(CommandOptions& Options)
-{
- AESEncContext* Context = 0;
- HMACContext* HMAC = 0;
- AS_02::PIDM::MXFWriter Writer;
- DCData::FrameBuffer FrameBuffer(Options.fb_size);
- DCData::SequenceParser Parser;
- byte_t IV_buf[CBC_BLOCK_SIZE];
- Kumu::FortunaRNG RNG;
-
- if ( ! Options.global_metadata_filename.empty() )
- {
- if ( ! Kumu::PathIsFile(Options.global_metadata_filename) )
- {
- fprintf(stderr, "No such file or filename: \"%s\".\n", Options.global_metadata_filename.c_str());
- return RESULT_PARAM;
- }
- }
-
- // set up essence parser
- Result_t result = Parser.OpenRead(Options.filenames.front());
-
- // set up MXF writer
- if ( ASDCP_SUCCESS(result) )
- {
-
- if ( Options.verbose_flag )
- {
- fprintf(stderr, "Aux Data\n");
- fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
- }
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- WriterInfo Info = s_MyInfo; // fill in your favorite identifiers here
- if ( Options.asset_id_flag )
- memcpy(Info.AssetUUID, Options.asset_id_value, UUIDlen);
- else
- Kumu::GenRandomUUID(Info.AssetUUID);
-
- Info.LabelSetType = LS_MXF_SMPTE;
-
- // configure encryption
- if( Options.key_flag )
- {
- Kumu::GenRandomUUID(Info.ContextID);
- Info.EncryptedEssence = true;
-
- if ( Options.key_id_flag )
- {
- memcpy(Info.CryptographicKeyID, Options.key_id_value, UUIDlen);
- }
- else
- {
- create_random_uuid(Info.CryptographicKeyID);
- }
-
- Context = new AESEncContext;
- result = Context->InitKey(Options.key_value);
-
- if ( ASDCP_SUCCESS(result) )
- result = Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
-
- if ( ASDCP_SUCCESS(result) && Options.write_hmac )
- {
- Info.UsesHMAC = true;
- HMAC = new HMACContext;
- result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- result = Writer.OpenWrite(Options.out_file, Info, Options.aux_data_coding, Options.edit_rate);
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- ui32_t duration = 0;
- result = Parser.Reset();
-
- while ( ASDCP_SUCCESS(result) && duration++ < Options.duration )
- {
- result = Parser.ReadFrame(FrameBuffer);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( Options.verbose_flag )
- FrameBuffer.Dump(stderr, Options.fb_dump_size);
-
- if ( Options.encrypt_header_flag )
- FrameBuffer.PlaintextOffset(0);
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
-
- // The Writer class will forward the last block of ciphertext
- // to the encryption context for use as the IV for the next
- // frame. If you want to use non-sequitur IV values, un-comment
- // the following line of code.
- // if ( ASDCP_SUCCESS(result) && Options.key_flag )
- // Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
- }
- }
-
- if ( result == RESULT_ENDOFFILE )
- result = RESULT_OK;
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- if ( Options.global_metadata_filename.empty() )
- {
- result = Writer.Finalize();
- }
- else
- {
- ASDCP::FrameBuffer global_metadata;
- ui32_t file_size = Kumu::FileSize(Options.global_metadata_filename);
- result = global_metadata.Capacity(file_size);
-
- if ( ASDCP_SUCCESS(result) )
- {
- ui32_t read_count = 0;
- Kumu::FileReader Reader;
-
- result = Reader.OpenRead(Options.global_metadata_filename);
-
- if ( ASDCP_SUCCESS(result) )
- result = Reader.Read(global_metadata.Data(), file_size, &read_count);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( file_size != read_count)
- return RESULT_READFAIL;
-
- global_metadata.Size(read_count);
- }
- }
-
- result = Writer.Finalize(global_metadata);
- }
- }
-
- return result;
-}
-
//
int
main(int argc, const char** argv)
result = write_JP2K_file(Options);
break;
- case ESS_DCDATA_UNKNOWN:
- if ( ! Options.aux_data_coding.HasValue() )
- {
- fprintf(stderr, "Option \"-U <UL>\" is required for Aux Data essence.\n");
- return 3;
- }
- else
- {
- result = write_aux_data_file(Options);
- }
- break;
-
default:
fprintf(stderr, "%s: Unknown file type, not P-HDR-compatible essence.\n",
Options.filenames.front().c_str());