1 //This is brl/bpro/core/vil_pro/processes/vil_nitf_date_time_process.cxx
2 //:
3 // \file
4
5 #include <iostream>
6 #include <cmath>
7 #include <vector>
8 #include "vil/vil_image_resource.h"
9 #include "vil/vil_load.h"
10 #include <vil/file_formats/vil_nitf2_image.h>
11 #ifdef _MSC_VER
12 # include "vcl_msvc_warnings.h"
13 #endif
14 #include <bprb/bprb_func_process.h>
15 //: set input and output types
vil_nitf_date_time_process_cons(bprb_func_process & pro)16 bool vil_nitf_date_time_process_cons(bprb_func_process& pro)
17 {
18 //input, a path to an nitf image
19 std::vector<std::string> input_types;
20 input_types.emplace_back("vcl_string"); // 0 nitf path
21 if (!pro.set_input_types(input_types))
22 return false;
23
24 //output, extracts IDATIM property from the NITF image subheader
25 std::vector<std::string> output_types;
26 output_types.emplace_back("int"); // 0 year
27 output_types.emplace_back("int"); // 1 month
28 output_types.emplace_back("int"); // 2 day
29 output_types.emplace_back("int"); // 3 hour
30 output_types.emplace_back("int"); // 4 min
31 output_types.emplace_back("int"); // 5 sec
32 return pro.set_output_types(output_types);
33 }
34
vil_nitf_date_time_process(bprb_func_process & pro)35 bool vil_nitf_date_time_process(bprb_func_process& pro)
36 {
37
38 if (pro.n_inputs()<1)
39 {
40 std::cout << pro.name() << " The input number should be " << 1 << std::endl;
41 return false;
42 }
43
44 //get the inputs
45 std::string nitf_image_path = pro.get_input<std::string>(0);
46 //read and parse NITF image
47 vil_image_resource_sptr image =
48 vil_load_image_resource(nitf_image_path.c_str());
49 if (!image)
50 {
51 std::cout << "NITF image load failed in vil_nitf_date_time_process\n";
52 return false;
53 }
54
55 std::string format = image->file_format();
56 std::string prefix = format.substr(0,4);
57
58 if (prefix != "nitf")
59 {
60 std::cout << "source image is not NITF in vil_nitf_date_time_process\n";
61 return false;
62 }
63
64 //cast to an nitf2_image
65 auto *nitf_image = static_cast<vil_nitf2_image*>(image.ptr());
66
67 //get NITF information
68 std::vector< vil_nitf2_image_subheader* > headers = nitf_image->get_image_headers();
69 // Note, assumes the the file contains exactly one image
70 vil_nitf2_image_subheader* hdr = headers[0];
71 if(!hdr){
72 std::cerr << "In vil_nitf_date_time_process: null image subheader\n";
73 return false;
74 }
75 int year, month, day, hour, min, sec;
76 bool success = hdr->get_date_time(year, month, day, hour, min, sec);
77 if (!success) {
78 std::cerr << "In vil_nitf_date_time_process: failed to obtain date time info\n";
79 return false;
80 }
81 //output date time info
82 pro.set_output_val<int>(0, year);
83 pro.set_output_val<int>(1, month);
84 pro.set_output_val<int>(2, day);
85 pro.set_output_val<int>(3, hour);
86 pro.set_output_val<int>(4, min);
87 pro.set_output_val<int>(5, sec);
88 return true;
89 }
90