annotate libmpcodecs/vd_zrmjpeg.c @ 32282:606e4157cd4c

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