}
}
+#if CONFIG_MJPEG_ENCODER
/**
* Encodes and outputs the entire frame in the JPEG format.
*
m->bits_ac_chrominance,
m->val_ac_chrominance);
}
+#endif
/**
* Writes the complete JPEG frame when optimal huffman tables are enabled,
PutBitContext *pbc = &s->pb;
int mb_y = s->mb_y - !s->mb_x;
int ret;
- MJpegContext *m;
-
- m = s->mjpeg_ctx;
+#if CONFIG_MJPEG_ENCODER
if (s->huffman == HUFFMAN_TABLE_OPTIMAL) {
+ MJpegContext *m = s->mjpeg_ctx;
+
mjpeg_build_optimal_huffman(m);
// Replace the VLCs with the optimal ones.
s->pred, s->intra_matrix, s->chroma_intra_matrix);
mjpeg_encode_picture_frame(s);
}
+#endif
ret = ff_mpv_reallocate_putbitbuffer(s, put_bits_count(&s->pb) / 8 + 100,
put_bits_count(&s->pb) / 4 + 1000);
av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
{
MJpegContext *m;
+ int ret;
av_assert0(s->slice_context_count == 1);
+ /* The following check is automatically true for AMV,
+ * but it doesn't hurt either. */
+ ret = ff_mjpeg_encode_check_pix_fmt(s->avctx);
+ if (ret < 0)
+ return ret;
+
if (s->width > 65500 || s->height > 65500) {
av_log(s, AV_LOG_ERROR, "JPEG does not support resolutions above 65500x65500\n");
return AVERROR(EINVAL);
{ "huffman", "Huffman table strategy", OFFSET(huffman), AV_OPT_TYPE_INT, { .i64 = HUFFMAN_TABLE_OPTIMAL }, 0, NB_HUFFMAN_TABLE_OPTION - 1, VE, "huffman" },
{ "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = HUFFMAN_TABLE_DEFAULT }, INT_MIN, INT_MAX, VE, "huffman" },
{ "optimal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = HUFFMAN_TABLE_OPTIMAL }, INT_MIN, INT_MAX, VE, "huffman" },
+{ "force_duplicated_matrix", "Always write luma and chroma matrix for mjpeg, useful for rtp streaming.", OFFSET(force_duplicated_matrix), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, VE },
+#if FF_API_MPEGVIDEO_OPTS
+FF_MPV_DEPRECATED_MPEG_QUANT_OPT
+FF_MPV_DEPRECATED_A53_CC_OPT
+FF_MPV_DEPRECATED_BFRAME_OPTS
+#endif
{ NULL},
};
.version = LIBAVUTIL_VERSION_INT,
};
-AVCodec ff_mjpeg_encoder = {
+const AVCodec ff_mjpeg_encoder = {
.name = "mjpeg",
.long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
.type = AVMEDIA_TYPE_VIDEO,
.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
.pix_fmts = (const enum AVPixelFormat[]) {
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_NONE
+ AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P,
+ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
+ AV_PIX_FMT_NONE
},
.priv_class = &mjpeg_class,
.profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
.version = LIBAVUTIL_VERSION_INT,
};
-AVCodec ff_amv_encoder = {
+const AVCodec ff_amv_encoder = {
.name = "amv",
.long_name = NULL_IF_CONFIG_SMALL("AMV Video"),
.type = AVMEDIA_TYPE_VIDEO,