annotate libmpcodecs/vd_zrmjpeg.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 05aa13cdf92f
children 288d00a5c11e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }