Mercurial > mplayer.hg
annotate libmpcodecs/vd_zrmjpeg.c @ 32714:5248e989612a
Remove libswscale subdirectory.
libswscale has been moved to FFmpeg since some time and only kept in the
MPlayer repository for historical reasons and difficulty in moving code
complete with history between Subversion repositories.
FFmpeg now contains libswscale directly without indirection through an
svn:externals property, so no reason to keep libswscale in MPlayer remains.
author | diego |
---|---|
date | Thu, 20 Jan 2011 09:41:43 +0000 |
parents | cc27da5d7286 |
children | d32f75f79517 |
rev | line source |
---|---|
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
1 /* |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
2 * Copyright (C) 2005 Rik Snel <rsnel@cube.dyndns.org> |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
3 * - based on vd_mpegpes.c by A'rpi (C) 2002-2003 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
4 * - guess_mjpeg_type code stolen from lav_io.c (C) 2000 Rainer Johanni |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
5 * <Rainer@Johanni.de> from the mjpegtools package |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
6 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
7 * This file is part of MPlayer. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
8 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
9 * MPlayer is free software; you can redistribute it and/or modify |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
10 * it under the terms of the GNU General Public License as published by |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
11 * the Free Software Foundation; either version 2 of the License, or |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
12 * (at your option) any later version. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
13 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
14 * MPlayer is distributed in the hope that it will be useful, |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
17 * GNU General Public License for more details. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
18 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
19 * You should have received a copy of the GNU General Public License along |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
22 */ |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
25962
diff
changeset
|
23 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
24 #include <stdio.h> |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
25 #include <stdlib.h> |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
26 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
27 #include "config.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
28 #include "mp_msg.h" |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14429
diff
changeset
|
29 #include "vfcap.h" |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
30 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
31 /* some convenient #define's, is this portable enough? */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
32 #define VERBOSE(...) mp_msg(MSGT_DECVIDEO, MSGL_V, "vd_zrmjpeg: " __VA_ARGS__) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
33 #define ERROR(...) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "vd_zrmjpeg: " __VA_ARGS__) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
34 #define WARNING(...) mp_msg(MSGT_DECVIDEO, MSGL_WARN, \ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
35 "vd_zrmjpeg: " __VA_ARGS__) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
36 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
37 #include "vd_internal.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
38 |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
29263
diff
changeset
|
39 static const vd_info_t info = |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
40 { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
41 "Zoran MJPEG Video passthrough", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
42 "zrmjpeg", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
43 "Rik Snel <snel@phys.uu.nl>", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
44 "Rik Snel <snel@phys.uu.nl>", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
45 "for hw decoders (DC10(+)/buz/lml33)" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
46 }; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
47 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
48 LIBVD_EXTERN(zrmjpeg) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
49 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
50 #include "libvo/video_out.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
51 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
52 typedef struct { |
25962 | 53 int vo_initialized; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
54 unsigned int preferred_csp; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
55 } vd_zrmjpeg_ctx_t; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
56 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
57 static int query_format(sh_video_t *sh, unsigned int format) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
58 vd_zrmjpeg_ctx_t *ctx = sh->context; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14429
diff
changeset
|
59 if (format == ctx->preferred_csp) return VFCAP_CSP_SUPPORTED; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
60 return CONTROL_FALSE; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
61 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
62 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
63 // to set/get/query special features/parameters |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
64 static int control(sh_video_t *sh, int cmd, void* arg, ...) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
65 switch (cmd) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
66 case VDCTRL_QUERY_FORMAT: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
67 return query_format(sh, *((unsigned int*)arg)); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
68 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
69 return CONTROL_UNKNOWN; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
70 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
71 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
72 // init driver |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
73 static int init(sh_video_t *sh) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
74 vd_zrmjpeg_ctx_t *ctx; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
75 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
76 VERBOSE("init called\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
77 ctx = malloc(sizeof(*ctx)); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
78 if (!ctx) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
79 memset(ctx, 0, sizeof(*ctx)); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
80 sh->context = ctx; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
81 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
82 /* defer init of vo until the first frame is known */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
83 return 1; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
84 #if 0 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
85 return mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_ZRMJPEGIT); |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
86 #endif |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
87 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
88 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
89 // uninit driver |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
90 static void uninit(sh_video_t *sh) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
91 free(sh->context); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
92 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
93 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
94 /* parts directly stolen from scan_jpg() and lav_open_input_file */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
95 static int get_int2(unsigned char *buf) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
96 return buf[0]*256 + buf[1]; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
97 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
98 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
99 #define M_SOF0 0xC0 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
100 #define M_SOF1 0xC1 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
101 #define M_DHT 0xC4 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
102 #define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
103 #define M_EOI 0xD9 /* End Of Image (end of datastream) */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
104 #define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
105 #define M_DQT 0xDB |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
106 #define M_APP0 0xE0 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
107 #define M_APP1 0xE1 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
108 /* returns 0 in case of failure */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
109 static unsigned int guess_mjpeg_type(unsigned char *data, unsigned int size, |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
110 int d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
111 unsigned int p; |
27731 | 112 int marker, length, height, i, hf[3], vf[3]; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
113 unsigned int app0 = 0, header = 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
114 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
115 /* The initial marker must be SIO */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
116 if (size < 2) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
117 ERROR("JPEG data too short (%d bytes)\n", size); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
118 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
119 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
120 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
121 if (data[0] != 0xFF || data[1] != M_SOI) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
122 ERROR("JPEG data must start with FFD8, but doesn't\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
123 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
124 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
125 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
126 p = 2; /* pointer within jpeg data */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
127 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
128 while (p < size) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
129 /* search 0xFF */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
130 while(data[p] != 0xFF) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
131 p++; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
132 if (p >= size) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
133 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
134 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
135 /* get marker code, skip duplicate FF's */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
136 while(data[p] == 0xFF) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
137 p++; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
138 if (p >= size) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
139 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
140 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
141 marker = data[p++]; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
142 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
143 /* marker may have an associated length */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
144 if (p <= size - 2) length = get_int2(data+p); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
145 else length = 0; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
146 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
147 switch (marker) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
148 case M_SOF0: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
149 case M_SOF1: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
150 header = p-2; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
151 VERBOSE("found offset of header %u\n", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
152 header); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
153 break; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
154 case M_SOS: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
155 size = 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
156 continue; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
157 case M_APP0: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
158 app0 = p-2; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
159 VERBOSE("found offset of APP0 %u\n", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
160 app0); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
161 break; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
162 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
163 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
164 /* these markers shouldn't have parameters, |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
165 * i.e. we don't need to skip anaything */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
166 if (marker == 0 || marker == 1 || |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
167 (marker >= 0xd0 && marker < 0xd8)) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
168 continue; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
169 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
170 if (p + length <= size) p += length; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
171 else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
172 ERROR("input JPEG too short, data missing\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
173 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
174 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
175 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
176 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
177 if (!header) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
178 ERROR("JPEG header (with resolution and sampling factors) not found\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
179 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
180 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
181 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
182 if (data[header + 9] != 3) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
183 ERROR("JPEG has wrong number of components\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
184 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
185 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
186 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
187 /* get the horizontal and vertical sample factors */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
188 for (i = 0; i < 3; i++) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
189 hf[i] = data[header + 10 + 3*i + 1]>>4; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
190 vf[i] = data[header + 10 + 3*i + 1]&0x0F; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
191 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
192 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
193 if (hf[0] != 2 || hf[1] != 1 || hf[2] != 1 || |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
194 vf[0] != 1 || vf[1] != 1 || vf[2] != 1) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
195 ERROR("JPEG has wrong internal image format\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
196 } else VERBOSE("JPEG has colorspace YUV422 with minimal sampling factors (good)\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
197 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
198 height = get_int2(data + header + 5); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
199 if (height == d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
200 VERBOSE("data is non interlaced\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
201 return IMGFMT_ZRMJPEGNI; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
202 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
203 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
204 if (2*height != d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
205 ERROR("something very inconsistent happened\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
206 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
207 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
208 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
209 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
210 if (app0 && get_int2(data + app0 + 2) >= 5 && |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
211 strncasecmp((char*)(data + app0 + 4), "AVI1", 4) == 0) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
212 if (data[app0+8] == 1) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
213 VERBOSE("data is interlaced, APP0: top-first (1)\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
214 return IMGFMT_ZRMJPEGIT; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
215 } else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
216 VERBOSE("data is interlaced, APP0: bottom-first (%d)\n", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
217 data[app0+8]); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
218 return IMGFMT_ZRMJPEGIB; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
219 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
220 } else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
221 VERBOSE("data is interlaced, no (valid) APP0 marker, " |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
222 "guessing top-first\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
223 return IMGFMT_ZRMJPEGIT; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
224 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
225 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
226 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
227 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
228 } |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
229 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
230 // decode a frame |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
231 static mp_image_t* decode(sh_video_t *sh, void* data, int len, int flags) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
232 mp_image_t* mpi; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
233 vd_zrmjpeg_ctx_t *ctx = sh->context; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
234 |
25962 | 235 if (!ctx->vo_initialized) { |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
236 ctx->preferred_csp = guess_mjpeg_type(data, len, sh->disp_h); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
237 if (ctx->preferred_csp == 0) return NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
238 mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
239 ctx->preferred_csp); |
25962 | 240 ctx->vo_initialized = 1; |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
241 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
242 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27731
diff
changeset
|
243 mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
244 sh->disp_w, sh->disp_h); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
245 /* abuse of mpi */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
246 mpi->planes[0]=(uint8_t*)data; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
247 mpi->planes[1]=(uint8_t*)len; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
248 return mpi; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
249 } |