summaryrefslogtreecommitdiff
path: root/src/as-02-unwrap.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2016-11-15 15:29:08 +0000
committerjhurst <>2016-11-15 15:29:08 +0000
commit3e3d2c56d2bea510c154181dfa782e96f663b7a2 (patch)
tree4f3c026625de45dd8b757c28a7a49e926973d461 /src/as-02-unwrap.cpp
parent07cb59bda9bbe78ca64c916206ea4d85bc95bb4c (diff)
1st draft as-02 aux data
Diffstat (limited to 'src/as-02-unwrap.cpp')
-rwxr-xr-xsrc/as-02-unwrap.cpp96
1 files changed, 94 insertions, 2 deletions
diff --git a/src/as-02-unwrap.cpp b/src/as-02-unwrap.cpp
index 43fe12f..1f40050 100755
--- a/src/as-02-unwrap.cpp
+++ b/src/as-02-unwrap.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2015, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
+Copyright (c) 2011-2016, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
John Hurst
All rights reserved.
@@ -97,6 +97,7 @@ Options:\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\
+ -e <extension> - Extension to use for aux data files. default \"bin\"\n\
-f <start-frame> - Starting frame number, default 0\n\
-h | -help - Show help\n\
-k <key-string> - Use key for ciphertext operations\n\
@@ -144,6 +145,7 @@ public:
byte_t key_id_value[UUIDlen];// value of given key ID (when key_id_flag is true)
PCM::ChannelFormat_t channel_fmt; // audio channel arrangement
const char* input_filename;
+ const char* extension;
std::string prefix_buffer;
//
@@ -153,7 +155,7 @@ public:
version_flag(false), help_flag(false), number_width(6),
start_frame(0), duration(0xffffffff), duration_flag(false), j2c_pedantic(true),
picture_rate(24), fb_size(FRAME_BUFFER_SIZE), file_prefix(0),
- input_filename(0)
+ input_filename(0), extension("bin")
{
memset(key_value, 0, KeyLen);
memset(key_id_value, 0, UUIDlen);
@@ -191,6 +193,11 @@ public:
duration = Kumu::xabs(strtol(argv[i], 0, 10));
break;
+ case 'e':
+ TEST_EXTRA_ARG(i, 'e');
+ extension = argv[i];
+ break;
+
case 'f':
TEST_EXTRA_ARG(i, 'f');
start_frame = Kumu::xabs(strtol(argv[i], 0, 10));
@@ -579,6 +586,87 @@ read_PCM_file(CommandOptions& Options)
}
+// 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::AuxData::MXFReader Reader;
+ DCData::FrameBuffer FrameBuffer(Options.fb_size);
+ ui32_t frame_count = 0;
+
+ Result_t result = Reader.OpenRead(Options.input_filename);
+
+ 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)
@@ -617,6 +705,10 @@ main(int argc, const char** argv)
result = read_PCM_file(Options);
break;
+ case ESS_DCDATA_UNKNOWN:
+ result = read_aux_data_file(Options);
+ break;
+
default:
fprintf(stderr, "%s: Unknown file type, not AS-02 essence.\n", Options.input_filename);
return 5;