Mercurial > mplayer.hg
annotate libmpcodecs/vd_zrmjpeg.c @ 17557:3f863d1d8b43
vYCoeffsBank and vCCoeffsBank are allocated and initialized using incorrect
sizes based on the image width instead of height.
patch by Alan Curry, pacman at world dot std dot com
author | diego |
---|---|
date | Wed, 08 Feb 2006 08:16:53 +0000 |
parents | 05aa13cdf92f |
children | 288d00a5c11e |
rev | line source |
---|---|
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
1 /* |
14429
90b4a1345b96
replace almost obsolete email address: snel@phys.uu.nl -> rsnel@cube.dyndns.org
rik
parents:
11386
diff
changeset
|
2 * Copyright (C) 2005 Rik Snel <rsnel@cube.dyndns.org>, license GPL v2 |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
3 * - based on vd_mpegpes.c by A'rpi (C) 2002-2003 |
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 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
6 */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
7 #include <stdio.h> |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
8 #include <stdlib.h> |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
9 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
10 #include "config.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
11 #include "mp_msg.h" |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14429
diff
changeset
|
12 #include "vfcap.h" |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
13 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
14 /* 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
|
15 #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
|
16 #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
|
17 #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
|
18 "vd_zrmjpeg: " __VA_ARGS__) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
19 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
20 #include "vd_internal.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
21 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
22 static vd_info_t info = |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
23 { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
24 "Zoran MJPEG Video passthrough", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
25 "zrmjpeg", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
26 "Rik Snel <snel@phys.uu.nl>", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
27 "Rik Snel <snel@phys.uu.nl>", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
28 "for hw decoders (DC10(+)/buz/lml33)" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
29 }; |
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 LIBVD_EXTERN(zrmjpeg) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
32 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
33 #include "libvo/video_out.h" |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
34 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
35 typedef struct { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
36 int vo_inited; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
37 unsigned int preferred_csp; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
38 } vd_zrmjpeg_ctx_t; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
39 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
40 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
|
41 vd_zrmjpeg_ctx_t *ctx = sh->context; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14429
diff
changeset
|
42 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
|
43 return CONTROL_FALSE; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
44 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
45 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
46 // to set/get/query special features/parameters |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
47 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
|
48 switch (cmd) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
49 case VDCTRL_QUERY_FORMAT: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
50 return query_format(sh, *((unsigned int*)arg)); |
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 return CONTROL_UNKNOWN; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
53 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
54 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
55 // init driver |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
56 static int init(sh_video_t *sh) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
57 vd_zrmjpeg_ctx_t *ctx; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
58 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
59 VERBOSE("init called\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
60 ctx = malloc(sizeof(*ctx)); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
61 if (!ctx) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
62 memset(ctx, 0, sizeof(*ctx)); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
63 sh->context = ctx; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
64 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
65 /* defer init of vo until the first frame is known */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
66 return 1; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
67 #if 0 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
68 return mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_ZRMJPEGIT); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
69 #endif |
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 // uninit driver |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
73 static void uninit(sh_video_t *sh) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
74 free(sh->context); |
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 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
77 /* 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
|
78 static int get_int2(unsigned char *buf) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
79 return buf[0]*256 + buf[1]; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
80 } |
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 #define M_SOF0 0xC0 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
83 #define M_SOF1 0xC1 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
84 #define M_DHT 0xC4 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
85 #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
|
86 #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
|
87 #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
|
88 #define M_DQT 0xDB |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
89 #define M_APP0 0xE0 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
90 #define M_APP1 0xE1 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
91 /* returns 0 in case of failure */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
92 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
|
93 int d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
94 unsigned int p; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
95 int marker, length, height, ncomps, i, hf[3], vf[3]; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
96 unsigned int app0 = 0, header = 0; |
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 /* The initial marker must be SIO */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
99 if (size < 2) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
100 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
|
101 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
102 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
103 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
104 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
|
105 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
|
106 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
107 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
108 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
109 p = 2; /* pointer within jpeg data */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
110 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
111 while (p < size) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
112 /* search 0xFF */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
113 while(data[p] != 0xFF) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
114 p++; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
115 if (p >= size) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
116 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
117 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
118 /* get marker code, skip duplicate FF's */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
119 while(data[p] == 0xFF) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
120 p++; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
121 if (p >= size) return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
122 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
123 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
124 marker = data[p++]; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
125 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
126 /* marker may have an associated length */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
127 if (p <= size - 2) length = get_int2(data+p); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
128 else length = 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
129 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
130 switch (marker) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
131 case M_SOF0: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
132 case M_SOF1: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
133 header = p-2; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
134 VERBOSE("found offset of header %u\n", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
135 header); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
136 break; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
137 case M_SOS: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
138 size = 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
139 continue; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
140 case M_APP0: |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
141 app0 = p-2; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
142 VERBOSE("found offset of APP0 %u\n", |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
143 app0); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
144 break; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
145 } |
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 /* these markers shouldn't have parameters, |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
148 * i.e. we don't need to skip anaything */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
149 if (marker == 0 || marker == 1 || |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
150 (marker >= 0xd0 && marker < 0xd8)) |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
151 continue; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
152 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
153 if (p + length <= size) p += length; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
154 else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
155 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
|
156 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
157 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
158 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
159 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
160 if (!header) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
161 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
|
162 return 0; |
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 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
165 if (data[header + 9] != 3) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
166 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
|
167 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
168 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
169 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
170 /* get the horizontal and vertical sample factors */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
171 for (i = 0; i < 3; i++) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
172 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
|
173 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
|
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 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
|
177 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
|
178 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
|
179 } 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
|
180 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
181 height = get_int2(data + header + 5); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
182 if (height == d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
183 VERBOSE("data is non interlaced\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
184 return IMGFMT_ZRMJPEGNI; |
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 if (2*height != d_height) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
188 ERROR("something very inconsistent happened\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
189 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
190 } |
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 (app0 && get_int2(data + app0 + 2) >= 5 && |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
194 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
|
195 if (data[app0+8] == 1) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
196 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
|
197 return IMGFMT_ZRMJPEGIT; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
198 } else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
199 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
|
200 data[app0+8]); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
201 return IMGFMT_ZRMJPEGIB; |
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 } else { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
204 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
|
205 "guessing top-first\n"); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
206 return IMGFMT_ZRMJPEGIT; |
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 return 0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
211 } |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
212 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
213 // decode a frame |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
214 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
|
215 mp_image_t* mpi; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
216 vd_zrmjpeg_ctx_t *ctx = sh->context; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
217 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
218 if (!ctx->vo_inited) { |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
219 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
|
220 if (ctx->preferred_csp == 0) return NULL; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
221 mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
222 ctx->preferred_csp); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
223 ctx->vo_inited = 1; |
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 |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
226 mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
227 sh->disp_w, sh->disp_h); |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
228 /* abuse of mpi */ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
229 mpi->planes[0]=(uint8_t*)data; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
230 mpi->planes[1]=(uint8_t*)len; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
231 return mpi; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff
changeset
|
232 } |