147
150
ptr = put_bits_ptr(p);
148
151
put_bits(p, 16, 0); /* patched later */
150
size += put_huffman_table(s, 0, 0, avpriv_mjpeg_bits_dc_luminance,
153
size += put_huffman_table(p, 0, 0, avpriv_mjpeg_bits_dc_luminance,
151
154
avpriv_mjpeg_val_dc);
152
size += put_huffman_table(s, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
155
size += put_huffman_table(p, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
153
156
avpriv_mjpeg_val_dc);
155
size += put_huffman_table(s, 1, 0, avpriv_mjpeg_bits_ac_luminance,
158
size += put_huffman_table(p, 1, 0, avpriv_mjpeg_bits_ac_luminance,
156
159
avpriv_mjpeg_val_ac_luminance);
157
size += put_huffman_table(s, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
160
size += put_huffman_table(p, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
158
161
avpriv_mjpeg_val_ac_chrominance);
159
162
AV_WB16(ptr, size);
162
static void jpeg_put_comments(MpegEncContext *s)
165
static void jpeg_put_comments(AVCodecContext *avctx, PutBitContext *p)
164
PutBitContext *p = &s->pb;
168
if (s->avctx->sample_aspect_ratio.num /* && !lossless */)
173
avpriv_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
174
put_bits(p, 16, 0x0102); /* v 1.02 */
175
put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
176
put_bits(p, 16, s->avctx->sample_aspect_ratio.num);
177
put_bits(p, 16, s->avctx->sample_aspect_ratio.den);
178
put_bits(p, 8, 0); /* thumbnail width */
179
put_bits(p, 8, 0); /* thumbnail height */
170
if (avctx->sample_aspect_ratio.num > 0 && avctx->sample_aspect_ratio.den > 0) {
174
avpriv_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
175
put_bits(p, 16, 0x0102); /* v 1.02 */
176
put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
177
put_bits(p, 16, avctx->sample_aspect_ratio.num);
178
put_bits(p, 16, avctx->sample_aspect_ratio.den);
179
put_bits(p, 8, 0); /* thumbnail width */
180
put_bits(p, 8, 0); /* thumbnail height */
183
if(!(s->flags & CODEC_FLAG_BITEXACT)){
184
if (!(avctx->flags & CODEC_FLAG_BITEXACT)) {
184
185
put_marker(p, COM);
185
186
flush_put_bits(p);
186
187
ptr = put_bits_ptr(p);
206
void ff_mjpeg_encode_picture_header(MpegEncContext *s)
208
const int lossless= s->avctx->codec_id != AV_CODEC_ID_MJPEG;
207
void ff_mjpeg_init_hvsample(AVCodecContext *avctx, int hsample[3], int vsample[3])
209
int chroma_h_shift, chroma_v_shift;
211
av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift,
213
if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
214
( avctx->pix_fmt == AV_PIX_FMT_BGR0
215
|| avctx->pix_fmt == AV_PIX_FMT_BGRA
216
|| avctx->pix_fmt == AV_PIX_FMT_BGR24)) {
217
vsample[0] = hsample[0] =
218
vsample[1] = hsample[1] =
219
vsample[2] = hsample[2] = 1;
220
} else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ444P) {
221
vsample[0] = vsample[1] = vsample[2] = 2;
222
hsample[0] = hsample[1] = hsample[2] = 1;
225
vsample[1] = 2 >> chroma_v_shift;
226
vsample[2] = 2 >> chroma_v_shift;
228
hsample[1] = 2 >> chroma_h_shift;
229
hsample[2] = 2 >> chroma_h_shift;
233
void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb,
234
ScanTable *intra_scantable,
235
uint16_t intra_matrix[64])
237
const int lossless = avctx->codec_id != AV_CODEC_ID_MJPEG && avctx->codec_id != AV_CODEC_ID_AMV;
238
int hsample[3], vsample[3];
211
put_marker(&s->pb, SOI);
241
ff_mjpeg_init_hvsample(avctx, hsample, vsample);
213
245
// hack for AMV mjpeg format
214
if(s->avctx->codec_id == AV_CODEC_ID_AMV) goto end;
216
jpeg_put_comments(s);
218
jpeg_table_header(s);
220
switch(s->avctx->codec_id){
221
case AV_CODEC_ID_MJPEG: put_marker(&s->pb, SOF0 ); break;
222
case AV_CODEC_ID_LJPEG: put_marker(&s->pb, SOF3 ); break;
246
if(avctx->codec_id == AV_CODEC_ID_AMV) goto end;
248
jpeg_put_comments(avctx, pb);
250
jpeg_table_header(avctx, pb, intra_scantable, intra_matrix, hsample);
252
switch (avctx->codec_id) {
253
case AV_CODEC_ID_MJPEG: put_marker(pb, SOF0 ); break;
254
case AV_CODEC_ID_LJPEG: put_marker(pb, SOF3 ); break;
223
255
default: av_assert0(0);
226
put_bits(&s->pb, 16, 17);
227
if(lossless && (s->avctx->pix_fmt == AV_PIX_FMT_BGR0
228
|| s->avctx->pix_fmt == AV_PIX_FMT_BGRA
229
|| s->avctx->pix_fmt == AV_PIX_FMT_BGR24))
230
put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */
258
put_bits(pb, 16, 17);
259
if (lossless && ( avctx->pix_fmt == AV_PIX_FMT_BGR0
260
|| avctx->pix_fmt == AV_PIX_FMT_BGRA
261
|| avctx->pix_fmt == AV_PIX_FMT_BGR24))
262
put_bits(pb, 8, 9); /* 9 bits/component RCT */
232
put_bits(&s->pb, 8, 8); /* 8 bits/component */
233
put_bits(&s->pb, 16, s->height);
234
put_bits(&s->pb, 16, s->width);
235
put_bits(&s->pb, 8, 3); /* 3 components */
264
put_bits(pb, 8, 8); /* 8 bits/component */
265
put_bits(pb, 16, avctx->height);
266
put_bits(pb, 16, avctx->width);
267
put_bits(pb, 8, 3); /* 3 components */
237
269
/* Y component */
238
put_bits(&s->pb, 8, 1); /* component number */
239
put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
240
put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
241
put_bits(&s->pb, 8, 0); /* select matrix */
270
put_bits(pb, 8, 1); /* component number */
271
put_bits(pb, 4, hsample[0]); /* H factor */
272
put_bits(pb, 4, vsample[0]); /* V factor */
273
put_bits(pb, 8, 0); /* select matrix */
243
275
/* Cb component */
244
put_bits(&s->pb, 8, 2); /* component number */
245
put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
246
put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
276
put_bits(pb, 8, 2); /* component number */
277
put_bits(pb, 4, hsample[1]); /* H factor */
278
put_bits(pb, 4, vsample[1]); /* V factor */
247
279
#ifdef TWOMATRIXES
248
put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
280
put_bits(pb, 8, lossless ? 0 : 1); /* select matrix */
250
put_bits(&s->pb, 8, 0); /* select matrix */
282
put_bits(pb, 8, 0); /* select matrix */
253
285
/* Cr component */
254
put_bits(&s->pb, 8, 3); /* component number */
255
put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
256
put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
286
put_bits(pb, 8, 3); /* component number */
287
put_bits(pb, 4, hsample[2]); /* H factor */
288
put_bits(pb, 4, vsample[2]); /* V factor */
257
289
#ifdef TWOMATRIXES
258
put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
290
put_bits(pb, 8, lossless ? 0 : 1); /* select matrix */
260
put_bits(&s->pb, 8, 0); /* select matrix */
292
put_bits(pb, 8, 0); /* select matrix */
263
295
/* scan header */
264
put_marker(&s->pb, SOS);
265
put_bits(&s->pb, 16, 12); /* length */
266
put_bits(&s->pb, 8, 3); /* 3 components */
297
put_bits(pb, 16, 12); /* length */
298
put_bits(pb, 8, 3); /* 3 components */
268
300
/* Y component */
269
put_bits(&s->pb, 8, 1); /* index */
270
put_bits(&s->pb, 4, 0); /* DC huffman table index */
271
put_bits(&s->pb, 4, 0); /* AC huffman table index */
301
put_bits(pb, 8, 1); /* index */
302
put_bits(pb, 4, 0); /* DC huffman table index */
303
put_bits(pb, 4, 0); /* AC huffman table index */
273
305
/* Cb component */
274
put_bits(&s->pb, 8, 2); /* index */
275
put_bits(&s->pb, 4, 1); /* DC huffman table index */
276
put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
306
put_bits(pb, 8, 2); /* index */
307
put_bits(pb, 4, 1); /* DC huffman table index */
308
put_bits(pb, 4, lossless ? 0 : 1); /* AC huffman table index */
278
310
/* Cr component */
279
put_bits(&s->pb, 8, 3); /* index */
280
put_bits(&s->pb, 4, 1); /* DC huffman table index */
281
put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
283
put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */
285
switch(s->avctx->codec_id){
286
case AV_CODEC_ID_MJPEG: put_bits(&s->pb, 8, 63); break; /* Se (not used) */
287
case AV_CODEC_ID_LJPEG: put_bits(&s->pb, 8, 0); break; /* not used */
311
put_bits(pb, 8, 3); /* index */
312
put_bits(pb, 4, 1); /* DC huffman table index */
313
put_bits(pb, 4, lossless ? 0 : 1); /* AC huffman table index */
315
put_bits(pb, 8, lossless ? avctx->prediction_method + 1 : 0); /* Ss (not used) */
317
switch (avctx->codec_id) {
318
case AV_CODEC_ID_MJPEG: put_bits(pb, 8, 63); break; /* Se (not used) */
319
case AV_CODEC_ID_LJPEG: put_bits(pb, 8, 0); break; /* not used */
288
320
default: av_assert0(0);
291
put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
323
put_bits(pb, 8, 0); /* Ah/Al (not used) */
294
s->esc_pos = put_bits_count(&s->pb) >> 3;
295
for(i=1; i<s->slice_context_count; i++)
296
s->thread_context[i]->esc_pos = 0;
327
MpegEncContext *s = avctx->priv_data;
328
av_assert0(avctx->codec->priv_data_size == sizeof(MpegEncContext));
330
s->esc_pos = put_bits_count(pb) >> 3;
331
for(i=1; i<s->slice_context_count; i++)
332
s->thread_context[i]->esc_pos = 0;
299
static void escape_FF(MpegEncContext *s, int start)
336
void ff_mjpeg_escape_FF(PutBitContext *pb, int start)
301
int size= put_bits_count(&s->pb) - start*8;
303
uint8_t *buf= s->pb.buf + start;
340
uint8_t *buf = pb->buf + start;
304
341
int align= (-(size_t)(buf))&3;
342
int pad = (-put_bits_count(pb))&7;
345
put_bits(pb, pad, (1<<pad)-1);
348
size = put_bits_count(pb) - start * 8;
306
350
av_assert1((size&7) == 0);