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