annotate libmpcodecs/vd_zrmjpeg.c @ 13610:b79ee5bf2c9e

Sync with GomGom's patch-12 version. updated copyright bvhq options added (xvid 1.1+ api4.1) psnr handling moved in separate functions proper free() on uninit printf -> mp_msg capability to flush delayed frames Changes by me (iive) support for flushing delayed frames at the end suppressed cosmetics and new aspect code changes
author iive
date Mon, 11 Oct 2004 15:48:18 +0000
parents 229079491864
children 90b4a1345b96
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 /*
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
2 * Copyright (C) 2003 Rik Snel <snel@phys.uu.nl>, license GPL v2
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"
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
12
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
13 /* 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
14 #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
15 #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
16 #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
17 "vd_zrmjpeg: " __VA_ARGS__)
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
18
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
19 #include "vd_internal.h"
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
20
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
21 static vd_info_t info =
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
22 {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
23 "Zoran MJPEG Video passthrough",
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
24 "zrmjpeg",
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
25 "Rik Snel <snel@phys.uu.nl>",
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 "for hw decoders (DC10(+)/buz/lml33)"
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
28 };
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 LIBVD_EXTERN(zrmjpeg)
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
31
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
32 #include "libvo/video_out.h"
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
33
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
34 typedef struct {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
35 int vo_inited;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
36 unsigned int preferred_csp;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
37 } vd_zrmjpeg_ctx_t;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
38
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
39 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
40 vd_zrmjpeg_ctx_t *ctx = sh->context;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
41 if (format == ctx->preferred_csp) return CONTROL_TRUE;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
42 return CONTROL_FALSE;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
43 }
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 // to set/get/query special features/parameters
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
46 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
47 switch (cmd) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
48 case VDCTRL_QUERY_FORMAT:
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
49 return query_format(sh, *((unsigned int*)arg));
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
50 }
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
51 return CONTROL_UNKNOWN;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
52 }
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 // init driver
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
55 static int init(sh_video_t *sh) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
56 vd_zrmjpeg_ctx_t *ctx;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
57
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
58 VERBOSE("init called\n");
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
59 ctx = malloc(sizeof(*ctx));
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
60 if (!ctx) return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
61 memset(ctx, 0, sizeof(*ctx));
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
62 sh->context = ctx;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
63
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
64 /* 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
65 return 1;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
66 #if 0
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
67 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
68 #endif
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
69 }
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 // uninit driver
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
72 static void uninit(sh_video_t *sh) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
73 free(sh->context);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
74 }
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 /* 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
77 static int get_int2(unsigned char *buf) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
78 return buf[0]*256 + buf[1];
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
79 }
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 #define M_SOF0 0xC0
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
82 #define M_SOF1 0xC1
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
83 #define M_DHT 0xC4
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
84 #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
85 #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
86 #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
87 #define M_DQT 0xDB
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
88 #define M_APP0 0xE0
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
89 #define M_APP1 0xE1
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
90 /* returns 0 in case of failure */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
91 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
92 int d_height) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
93 unsigned int p;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
94 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
95 unsigned int app0 = 0, header = 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
96
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
97 /* The initial marker must be SIO */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
98 if (size < 2) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
99 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
100 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
101 }
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 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
104 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
105 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
106 }
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 p = 2; /* pointer within jpeg data */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
109
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
110 while (p < size) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
111 /* search 0xFF */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
112 while(data[p] != 0xFF) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
113 p++;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
114 if (p >= size) return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
115 }
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 /* get marker code, skip duplicate FF's */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
118 while(data[p] == 0xFF) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
119 p++;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
120 if (p >= size) return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
121 }
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 marker = data[p++];
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
124
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
125 /* marker may have an associated length */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
126 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
127 else length = 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
128
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
129 switch (marker) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
130 case M_SOF0:
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
131 case M_SOF1:
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
132 header = p-2;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
133 VERBOSE("found offset of header %u\n",
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
134 header);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
135 break;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
136 case M_SOS:
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
137 size = 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
138 continue;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
139 case M_APP0:
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
140 app0 = p-2;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
141 VERBOSE("found offset of APP0 %u\n",
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
142 app0);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
143 break;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
144 }
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 /* these markers shouldn't have parameters,
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
147 * 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
148 if (marker == 0 || marker == 1 ||
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
149 (marker >= 0xd0 && marker < 0xd8))
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
150 continue;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
151
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
152 if (p + length <= size) p += length;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
153 else {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
154 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
155 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
156 }
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 if (!header) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
160 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
161 return 0;
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 if (data[header + 9] != 3) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
165 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
166 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
167 }
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 /* get the horizontal and vertical sample factors */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
170 for (i = 0; i < 3; i++) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
171 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
172 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
173 }
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 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
176 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
177 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
178 } 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
179
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
180 height = get_int2(data + header + 5);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
181 if (height == d_height) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
182 VERBOSE("data is non interlaced\n");
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
183 return IMGFMT_ZRMJPEGNI;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
184 }
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 if (2*height != d_height) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
187 ERROR("something very inconsistent happened\n");
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
188 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
189 }
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 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
193 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
194 if (data[app0+8] == 1) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
195 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
196 return IMGFMT_ZRMJPEGIT;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
197 } else {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
198 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
199 data[app0+8]);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
200 return IMGFMT_ZRMJPEGIB;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
201 }
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
202 } else {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
203 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
204 "guessing top-first\n");
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
205 return IMGFMT_ZRMJPEGIT;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
206 }
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 return 0;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
210 }
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 // decode a frame
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
213 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
214 mp_image_t* mpi;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
215 vd_zrmjpeg_ctx_t *ctx = sh->context;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
216
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
217 if (!ctx->vo_inited) {
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
218 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
219 if (ctx->preferred_csp == 0) return NULL;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
220 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
221 ctx->preferred_csp);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
222 ctx->vo_inited = 1;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
223 }
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 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
226 sh->disp_w, sh->disp_h);
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
227 /* abuse of mpi */
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
228 mpi->planes[0]=(uint8_t*)data;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
229 mpi->planes[1]=(uint8_t*)len;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
230 return mpi;
229079491864 addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
diff changeset
231 }