X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fas-02-unwrap.cpp;h=43fe12f8c2617665bb8e09542dd60fd59cc55999;hb=cc05011a20424c6b855995b5965782582ca21c42;hp=b8f69a0a169bf0946f7a8ca20659a62153cef869;hpb=dd03f3ae2c71df2c4eb89804293e621777a050cf;p=asdcplib.git diff --git a/src/as-02-unwrap.cpp b/src/as-02-unwrap.cpp index b8f69a0..43fe12f 100755 --- a/src/as-02-unwrap.cpp +++ b/src/as-02-unwrap.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2011-2014, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, +Copyright (c) 2011-2015, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, John Hurst All rights reserved. @@ -69,7 +69,7 @@ banner(FILE* stream = stdout) { fprintf(stream, "\n\ %s (asdcplib %s)\n\n\ -Copyright (c) 2011-2014, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, John Hurst\n\n\ +Copyright (c) 2011-2015, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, 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", @@ -86,7 +86,7 @@ USAGE: %s [-h|-help] [-V]\n\ %s [-1|-2] [-b ] [-d ]\n\ [-f ] [-m] [-p ] [-R] [-s ] [-v] [-W]\n\ [-w] []\n\n", - PROGRAM_NAME, PROGRAM_NAME, PROGRAM_NAME); + PROGRAM_NAME, PROGRAM_NAME); fprintf(stream, "\ Options:\n\ @@ -178,7 +178,7 @@ public: 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); @@ -188,12 +188,12 @@ public: case 'd': TEST_EXTRA_ARG(i, 'd'); duration_flag = true; - duration = abs(atoi(argv[i])); + duration = Kumu::xabs(strtol(argv[i], 0, 10)); 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 'h': help_flag = true; break; @@ -201,12 +201,12 @@ public: 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': TEST_EXTRA_ARG(i, 's'); - fb_dump_size = abs(atoi(argv[i])); + fb_dump_size = Kumu::xabs(strtol(argv[i], 0, 10)); break; case 'V': version_flag = true; break; @@ -215,7 +215,7 @@ public: case 'w': TEST_EXTRA_ARG(i, 'w'); - number_width = abs(atoi(argv[i])); + number_width = Kumu::xabs(strtol(argv[i], 0, 10)); break; case 'Z': j2c_pedantic = false; break; @@ -376,19 +376,34 @@ read_JP2K_file(CommandOptions& Options) { result = Reader.ReadFrame(i, FrameBuffer, Context, HMAC); - if ( ASDCP_SUCCESS(result) ) + char filename[1024]; + snprintf(filename, 1024, name_format, Options.file_prefix, i); + + if ( ASDCP_SUCCESS(result) && Options.verbose_flag ) + { + printf("Frame %d, %d bytes", i, FrameBuffer.Size()); + + if ( ! Options.no_write_flag ) + { + printf(" -> %s", filename); + } + + printf("\n"); + } + + if ( ASDCP_SUCCESS(result) && ( ! 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); + if ( ASDCP_SUCCESS(result) && Options.verbose_flag ) + { + FrameBuffer.Dump(stderr, Options.fb_dump_size); + } } } @@ -456,6 +471,20 @@ read_PCM_file(CommandOptions& Options) last_frame = wave_descriptor->ContainerDuration; } + if ( last_frame == 0 ) + { + fprintf(stderr, "ContainerDuration not set in index, attempting to use Duration from SourceClip.\n"); + result = Reader.OP1aHeader().GetMDObjectByType(DefaultCompositeDict().ul(MDD_SourceClip), &tmp_obj); + if ( KM_SUCCESS(result)) + { + ASDCP::MXF::SourceClip *sourceClip = dynamic_cast(tmp_obj); + if ( ! sourceClip->Duration.empty() ) + { + last_frame = sourceClip->Duration; + } + } + } + if ( last_frame == 0 ) { fprintf(stderr, "Unable to determine file duration.\n"); @@ -535,6 +564,13 @@ read_PCM_file(CommandOptions& Options) FrameBuffer.Dump(stderr, Options.fb_dump_size); } + if ( FrameBuffer.Size() != FrameBuffer.Capacity() ) + { + fprintf(stderr, "Last frame is incomplete, padding with zeros.\n"); + // actually, it has already been zeroed for us, we just need to recognize the appropriate size + FrameBuffer.Size(FrameBuffer.Capacity()); + } + result = OutWave.WriteFrame(FrameBuffer); } } @@ -582,7 +618,7 @@ main(int argc, const char** argv) break; default: - fprintf(stderr, "%s: Unknown file type, not ASDCP essence.\n", Options.input_filename); + fprintf(stderr, "%s: Unknown file type, not AS-02 essence.\n", Options.input_filename); return 5; } }