Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4758 | right-hear | 1 | /* |
2 | * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium |
||
3 | * Copyright (c) 2002-2007, Professor Benoit Macq |
||
4 | * Copyright (c) 2003-2007, Francois-Olivier Devaux |
||
5 | * All rights reserved. |
||
6 | * |
||
7 | * Redistribution and use in source and binary forms, with or without |
||
8 | * modification, are permitted provided that the following conditions |
||
9 | * are met: |
||
10 | * 1. Redistributions of source code must retain the above copyright |
||
11 | * notice, this list of conditions and the following disclaimer. |
||
12 | * 2. Redistributions in binary form must reproduce the above copyright |
||
13 | * notice, this list of conditions and the following disclaimer in the |
||
14 | * documentation and/or other materials provided with the distribution. |
||
15 | * |
||
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
||
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||
26 | * POSSIBILITY OF SUCH DAMAGE. |
||
27 | */ |
||
28 | |||
29 | #include |
||
30 | #include |
||
31 | #include |
||
32 | |||
33 | #include "openjpeg.h" |
||
34 | #include "../libopenjpeg/j2k.h" |
||
35 | #include "../libopenjpeg/jp2.h" |
||
36 | #include "mj2.h" |
||
37 | |||
38 | /* -------------------------------------------------------------------------- */ |
||
39 | |||
40 | /** |
||
41 | sample error callback expecting a FILE* client object |
||
42 | */ |
||
43 | void error_callback(const char *msg, void *client_data) { |
||
44 | FILE *stream = (FILE*)client_data; |
||
45 | fprintf(stream, "[ERROR] %s", msg); |
||
46 | } |
||
47 | /** |
||
48 | sample warning callback expecting a FILE* client object |
||
49 | */ |
||
50 | void warning_callback(const char *msg, void *client_data) { |
||
51 | FILE *stream = (FILE*)client_data; |
||
52 | fprintf(stream, "[WARNING] %s", msg); |
||
53 | } |
||
54 | /** |
||
55 | sample debug callback expecting a FILE* client object |
||
56 | */ |
||
57 | void info_callback(const char *msg, void *client_data) { |
||
58 | FILE *stream = (FILE*)client_data; |
||
59 | fprintf(stream, "[INFO] %s", msg); |
||
60 | } |
||
61 | |||
62 | /* -------------------------------------------------------------------------- */ |
||
63 | |||
64 | |||
65 | int main(int argc, char *argv[]) { |
||
66 | opj_dinfo_t* dinfo; |
||
67 | opj_event_mgr_t event_mgr; /* event manager */ |
||
68 | int tnum; |
||
69 | unsigned int snum; |
||
70 | opj_mj2_t *movie; |
||
71 | mj2_tk_t *track; |
||
72 | mj2_sample_t *sample; |
||
73 | unsigned char* frame_codestream; |
||
74 | FILE *file, *outfile; |
||
75 | char outfilename[50]; |
||
76 | mj2_dparameters_t parameters; |
||
77 | |||
78 | if (argc != 3) { |
||
79 | printf("Usage: %s mj2filename output_location\n",argv[0]); |
||
80 | printf("Example: %s foreman.mj2 output/foreman\n",argv[0]); |
||
81 | return 1; |
||
82 | } |
||
83 | |||
84 | file = fopen(argv[1], "rb"); |
||
85 | |||
86 | if (!file) { |
||
87 | fprintf(stderr, "failed to open %s for reading\n", argv[1]); |
||
88 | return 1; |
||
89 | } |
||
90 | |||
91 | /* |
||
92 | configure the event callbacks (not required) |
||
93 | setting of each callback is optionnal |
||
94 | */ |
||
95 | memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); |
||
96 | event_mgr.error_handler = error_callback; |
||
97 | event_mgr.warning_handler = warning_callback; |
||
98 | event_mgr.info_handler = info_callback; |
||
99 | |||
100 | /* get a MJ2 decompressor handle */ |
||
101 | dinfo = mj2_create_decompress(); |
||
102 | |||
103 | /* catch events using our callbacks and give a local context */ |
||
104 | opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); |
||
105 | |||
106 | /* setup the decoder decoding parameters using user parameters */ |
||
107 | movie = (opj_mj2_t*) dinfo->mj2_handle; |
||
108 | mj2_setup_decoder((opj_mj2_t*)dinfo->mj2_handle, ¶meters); |
||
109 | |||
110 | if (mj2_read_struct(file, movie)) // Creating the movie structure |
||
111 | return 1; |
||
112 | |||
113 | // Decode first video track |
||
114 | tnum = 0; |
||
115 | while (movie->tk[tnum].track_type != 0) |
||
116 | tnum ++; |
||
117 | |||
118 | track = &movie->tk[tnum]; |
||
119 | |||
120 | fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); |
||
121 | |||
122 | for (snum=0; snum < track->num_samples; snum++) |
||
123 | { |
||
124 | sample = &track->sample[snum]; |
||
125 | frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker |
||
126 | fseek(file,sample->offset+8,SEEK_SET); |
||
127 | fread(frame_codestream,sample->sample_size-8,1, file); // Assuming that jp and ftyp markers size do |
||
128 | |||
129 | sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); |
||
130 | outfile = fopen(outfilename, "wb"); |
||
131 | if (!outfile) { |
||
132 | fprintf(stderr, "failed to open %s for writing\n",outfilename); |
||
133 | return 1; |
||
134 | } |
||
135 | fwrite(frame_codestream,sample->sample_size-8,1,outfile); |
||
136 | fclose(outfile); |
||
137 | free(frame_codestream); |
||
138 | } |
||
139 | fclose(file); |
||
140 | fprintf(stdout, "%d frames correctly extracted\n", snum); |
||
141 | |||
142 | /* free remaining structures */ |
||
143 | if(dinfo) { |
||
144 | mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); |
||
145 | } |
||
146 | |||
147 | return 0; |
||
148 | }> |