|
38 | 38 | #include "libavutil/imgutils.h"
|
39 | 39 | #include "libavutil/samplefmt.h"
|
40 | 40 |
|
| 41 | + |
| 42 | +static const enum AVPixelFormat *get_compliance_unofficial_pix_fmts(enum AVCodecID codec_id, const enum AVPixelFormat default_formats[]) |
| 43 | +{ |
| 44 | + static const enum AVPixelFormat mjpeg_formats[] = |
| 45 | + { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, |
| 46 | + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, |
| 47 | + AV_PIX_FMT_NONE }; |
| 48 | + static const enum AVPixelFormat ljpeg_formats[] = |
| 49 | + { AV_PIX_FMT_BGR24 , AV_PIX_FMT_BGRA , AV_PIX_FMT_BGR0, |
| 50 | + AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, |
| 51 | + AV_PIX_FMT_YUV420P , AV_PIX_FMT_YUV444P , AV_PIX_FMT_YUV422P, |
| 52 | + AV_PIX_FMT_NONE}; |
| 53 | + |
| 54 | + if (codec_id == AV_CODEC_ID_MJPEG) { |
| 55 | + return mjpeg_formats; |
| 56 | + } else if (codec_id == AV_CODEC_ID_LJPEG) { |
| 57 | + return ljpeg_formats; |
| 58 | + } else { |
| 59 | + return default_formats; |
| 60 | + } |
| 61 | +} |
| 62 | + |
41 | 63 | enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target)
|
42 | 64 | {
|
43 | 65 | if (codec && codec->pix_fmts) {
|
44 | 66 | const enum AVPixelFormat *p = codec->pix_fmts;
|
45 | 67 | const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target);
|
46 | 68 | int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
|
47 | 69 | enum AVPixelFormat best= AV_PIX_FMT_NONE;
|
48 |
| - static const enum AVPixelFormat mjpeg_formats[] = |
49 |
| - { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, |
50 |
| - AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, |
51 |
| - AV_PIX_FMT_NONE }; |
52 |
| - static const enum AVPixelFormat ljpeg_formats[] = |
53 |
| - { AV_PIX_FMT_BGR24 , AV_PIX_FMT_BGRA , AV_PIX_FMT_BGR0, |
54 |
| - AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, |
55 |
| - AV_PIX_FMT_YUV420P , AV_PIX_FMT_YUV444P , AV_PIX_FMT_YUV422P, |
56 |
| - AV_PIX_FMT_NONE}; |
57 | 70 |
|
58 | 71 | if (enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
|
59 |
| - if (enc_ctx->codec_id == AV_CODEC_ID_MJPEG) { |
60 |
| - p = mjpeg_formats; |
61 |
| - } else if (enc_ctx->codec_id == AV_CODEC_ID_LJPEG) { |
62 |
| - p =ljpeg_formats; |
63 |
| - } |
| 72 | + p = get_compliance_unofficial_pix_fmts(enc_ctx->codec_id, p); |
64 | 73 | }
|
65 | 74 | for (; *p != AV_PIX_FMT_NONE; p++) {
|
66 | 75 | best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
|
@@ -130,12 +139,7 @@ static char *choose_pix_fmts(OutputStream *ost)
|
130 | 139 |
|
131 | 140 | p = ost->enc->pix_fmts;
|
132 | 141 | if (ost->enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
|
133 |
| - if (ost->enc_ctx->codec_id == AV_CODEC_ID_MJPEG) { |
134 |
| - p = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_NONE }; |
135 |
| - } else if (ost->enc_ctx->codec_id == AV_CODEC_ID_LJPEG) { |
136 |
| - p = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P, |
137 |
| - AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE }; |
138 |
| - } |
| 142 | + p = get_compliance_unofficial_pix_fmts(ost->enc_ctx->codec_id, p); |
139 | 143 | }
|
140 | 144 |
|
141 | 145 | for (; *p != AV_PIX_FMT_NONE; p++) {
|
|
0 commit comments