1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * PNM image format 3cabdff1aSopenharmony_ci * Copyright (c) 2002, 2003 Fabrice Bellard 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "config_components.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 25cabdff1aSopenharmony_ci#include "libavutil/imgutils.h" 26cabdff1aSopenharmony_ci#include "libavutil/pixdesc.h" 27cabdff1aSopenharmony_ci#include "avcodec.h" 28cabdff1aSopenharmony_ci#include "codec_internal.h" 29cabdff1aSopenharmony_ci#include "encode.h" 30cabdff1aSopenharmony_ci#include "float2half.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_citypedef struct PHMEncContext { 33cabdff1aSopenharmony_ci uint16_t basetable[512]; 34cabdff1aSopenharmony_ci uint8_t shifttable[512]; 35cabdff1aSopenharmony_ci} PHMEncContext; 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_cistatic int pnm_encode_frame(AVCodecContext *avctx, AVPacket *pkt, 38cabdff1aSopenharmony_ci const AVFrame *p, int *got_packet) 39cabdff1aSopenharmony_ci{ 40cabdff1aSopenharmony_ci PHMEncContext *s = avctx->priv_data; 41cabdff1aSopenharmony_ci uint8_t *bytestream, *bytestream_start, *bytestream_end; 42cabdff1aSopenharmony_ci int i, h, h1, c, n, linesize, ret; 43cabdff1aSopenharmony_ci uint8_t *ptr, *ptr1, *ptr2; 44cabdff1aSopenharmony_ci int size = av_image_get_buffer_size(avctx->pix_fmt, 45cabdff1aSopenharmony_ci avctx->width, avctx->height, 1); 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci if ((ret = ff_get_encode_buffer(avctx, pkt, size + 200, 0)) < 0) 48cabdff1aSopenharmony_ci return ret; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci bytestream_start = 51cabdff1aSopenharmony_ci bytestream = pkt->data; 52cabdff1aSopenharmony_ci bytestream_end = pkt->data + pkt->size; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci h = avctx->height; 55cabdff1aSopenharmony_ci h1 = h; 56cabdff1aSopenharmony_ci switch (avctx->pix_fmt) { 57cabdff1aSopenharmony_ci case AV_PIX_FMT_MONOWHITE: 58cabdff1aSopenharmony_ci c = '4'; 59cabdff1aSopenharmony_ci n = (avctx->width + 7) >> 3; 60cabdff1aSopenharmony_ci break; 61cabdff1aSopenharmony_ci case AV_PIX_FMT_GRAY8: 62cabdff1aSopenharmony_ci c = '5'; 63cabdff1aSopenharmony_ci n = avctx->width; 64cabdff1aSopenharmony_ci break; 65cabdff1aSopenharmony_ci case AV_PIX_FMT_GRAY16BE: 66cabdff1aSopenharmony_ci c = '5'; 67cabdff1aSopenharmony_ci n = avctx->width * 2; 68cabdff1aSopenharmony_ci break; 69cabdff1aSopenharmony_ci case AV_PIX_FMT_RGB24: 70cabdff1aSopenharmony_ci c = '6'; 71cabdff1aSopenharmony_ci n = avctx->width * 3; 72cabdff1aSopenharmony_ci break; 73cabdff1aSopenharmony_ci case AV_PIX_FMT_RGB48BE: 74cabdff1aSopenharmony_ci c = '6'; 75cabdff1aSopenharmony_ci n = avctx->width * 6; 76cabdff1aSopenharmony_ci break; 77cabdff1aSopenharmony_ci case AV_PIX_FMT_YUV420P: 78cabdff1aSopenharmony_ci if (avctx->width & 1 || avctx->height & 1) { 79cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "pgmyuv needs even width and height\n"); 80cabdff1aSopenharmony_ci return AVERROR(EINVAL); 81cabdff1aSopenharmony_ci } 82cabdff1aSopenharmony_ci c = '5'; 83cabdff1aSopenharmony_ci n = avctx->width; 84cabdff1aSopenharmony_ci h1 = (h * 3) / 2; 85cabdff1aSopenharmony_ci break; 86cabdff1aSopenharmony_ci case AV_PIX_FMT_YUV420P16BE: 87cabdff1aSopenharmony_ci c = '5'; 88cabdff1aSopenharmony_ci n = avctx->width * 2; 89cabdff1aSopenharmony_ci h1 = (h * 3) / 2; 90cabdff1aSopenharmony_ci break; 91cabdff1aSopenharmony_ci case AV_PIX_FMT_GBRPF32BE: 92cabdff1aSopenharmony_ci case AV_PIX_FMT_GBRPF32LE: 93cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_PFM) { 94cabdff1aSopenharmony_ci c = 'F'; 95cabdff1aSopenharmony_ci n = avctx->width * 4; 96cabdff1aSopenharmony_ci } else { 97cabdff1aSopenharmony_ci c = 'H'; 98cabdff1aSopenharmony_ci n = avctx->width * 2; 99cabdff1aSopenharmony_ci } 100cabdff1aSopenharmony_ci break; 101cabdff1aSopenharmony_ci case AV_PIX_FMT_GRAYF32BE: 102cabdff1aSopenharmony_ci case AV_PIX_FMT_GRAYF32LE: 103cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_PFM) { 104cabdff1aSopenharmony_ci c = 'f'; 105cabdff1aSopenharmony_ci n = avctx->width * 4; 106cabdff1aSopenharmony_ci } else { 107cabdff1aSopenharmony_ci c = 'h'; 108cabdff1aSopenharmony_ci n = avctx->width * 2; 109cabdff1aSopenharmony_ci } 110cabdff1aSopenharmony_ci break; 111cabdff1aSopenharmony_ci default: 112cabdff1aSopenharmony_ci return -1; 113cabdff1aSopenharmony_ci } 114cabdff1aSopenharmony_ci snprintf(bytestream, bytestream_end - bytestream, 115cabdff1aSopenharmony_ci "P%c\n%d %d\n", c, avctx->width, h1); 116cabdff1aSopenharmony_ci bytestream += strlen(bytestream); 117cabdff1aSopenharmony_ci if (avctx->pix_fmt == AV_PIX_FMT_GBRPF32LE || 118cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GRAYF32LE || 119cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GBRPF32BE || 120cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GRAYF32BE) 121cabdff1aSopenharmony_ci snprintf(bytestream, bytestream_end - bytestream, 122cabdff1aSopenharmony_ci "%f\n", (avctx->pix_fmt == AV_PIX_FMT_GBRPF32BE || 123cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GRAYF32BE) ? 1.f: -1.f); 124cabdff1aSopenharmony_ci bytestream += strlen(bytestream); 125cabdff1aSopenharmony_ci if (avctx->pix_fmt != AV_PIX_FMT_MONOWHITE && 126cabdff1aSopenharmony_ci avctx->pix_fmt != AV_PIX_FMT_GBRPF32LE && 127cabdff1aSopenharmony_ci avctx->pix_fmt != AV_PIX_FMT_GRAYF32LE && 128cabdff1aSopenharmony_ci avctx->pix_fmt != AV_PIX_FMT_GBRPF32BE && 129cabdff1aSopenharmony_ci avctx->pix_fmt != AV_PIX_FMT_GRAYF32BE) { 130cabdff1aSopenharmony_ci int maxdepth = (1 << av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth) - 1; 131cabdff1aSopenharmony_ci snprintf(bytestream, bytestream_end - bytestream, 132cabdff1aSopenharmony_ci "%d\n", maxdepth); 133cabdff1aSopenharmony_ci bytestream += strlen(bytestream); 134cabdff1aSopenharmony_ci } 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci if ((avctx->pix_fmt == AV_PIX_FMT_GBRPF32LE || 137cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GBRPF32BE) && c == 'F') { 138cabdff1aSopenharmony_ci float *r = (float *)p->data[2]; 139cabdff1aSopenharmony_ci float *g = (float *)p->data[0]; 140cabdff1aSopenharmony_ci float *b = (float *)p->data[1]; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci for (int i = 0; i < avctx->height; i++) { 143cabdff1aSopenharmony_ci for (int j = 0; j < avctx->width; j++) { 144cabdff1aSopenharmony_ci AV_WN32(bytestream + 0, av_float2int(r[j])); 145cabdff1aSopenharmony_ci AV_WN32(bytestream + 4, av_float2int(g[j])); 146cabdff1aSopenharmony_ci AV_WN32(bytestream + 8, av_float2int(b[j])); 147cabdff1aSopenharmony_ci bytestream += 12; 148cabdff1aSopenharmony_ci } 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci r += p->linesize[2] / 4; 151cabdff1aSopenharmony_ci g += p->linesize[0] / 4; 152cabdff1aSopenharmony_ci b += p->linesize[1] / 4; 153cabdff1aSopenharmony_ci } 154cabdff1aSopenharmony_ci } else if ((avctx->pix_fmt == AV_PIX_FMT_GRAYF32LE || 155cabdff1aSopenharmony_ci avctx->pix_fmt == AV_PIX_FMT_GRAYF32BE) && c == 'f') { 156cabdff1aSopenharmony_ci const float *g = (const float *)p->data[0]; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci for (int i = 0; i < avctx->height; i++) { 159cabdff1aSopenharmony_ci for (int j = 0; j < avctx->width; j++) { 160cabdff1aSopenharmony_ci AV_WN32(bytestream, av_float2int(g[j])); 161cabdff1aSopenharmony_ci bytestream += 4; 162cabdff1aSopenharmony_ci } 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci g += p->linesize[0] / 4; 165cabdff1aSopenharmony_ci } 166cabdff1aSopenharmony_ci } else if (avctx->pix_fmt == AV_PIX_FMT_GBRPF32 && c == 'H') { 167cabdff1aSopenharmony_ci float *r = (float *)p->data[2]; 168cabdff1aSopenharmony_ci float *g = (float *)p->data[0]; 169cabdff1aSopenharmony_ci float *b = (float *)p->data[1]; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci for (int i = 0; i < avctx->height; i++) { 172cabdff1aSopenharmony_ci for (int j = 0; j < avctx->width; j++) { 173cabdff1aSopenharmony_ci AV_WN16(bytestream + 0, float2half(av_float2int(r[j]), s->basetable, s->shifttable)); 174cabdff1aSopenharmony_ci AV_WN16(bytestream + 2, float2half(av_float2int(g[j]), s->basetable, s->shifttable)); 175cabdff1aSopenharmony_ci AV_WN16(bytestream + 4, float2half(av_float2int(b[j]), s->basetable, s->shifttable)); 176cabdff1aSopenharmony_ci bytestream += 6; 177cabdff1aSopenharmony_ci } 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci r += p->linesize[2] / 4; 180cabdff1aSopenharmony_ci g += p->linesize[0] / 4; 181cabdff1aSopenharmony_ci b += p->linesize[1] / 4; 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci } else if (avctx->pix_fmt == AV_PIX_FMT_GRAYF32 && c == 'h') { 184cabdff1aSopenharmony_ci const float *g = (const float *)p->data[0]; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci for (int i = 0; i < avctx->height; i++) { 187cabdff1aSopenharmony_ci for (int j = 0; j < avctx->width; j++) { 188cabdff1aSopenharmony_ci AV_WN16(bytestream, float2half(av_float2int(g[j]), s->basetable, s->shifttable)); 189cabdff1aSopenharmony_ci bytestream += 2; 190cabdff1aSopenharmony_ci } 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci g += p->linesize[0] / 4; 193cabdff1aSopenharmony_ci } 194cabdff1aSopenharmony_ci } else { 195cabdff1aSopenharmony_ci ptr = p->data[0]; 196cabdff1aSopenharmony_ci linesize = p->linesize[0]; 197cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { 198cabdff1aSopenharmony_ci memcpy(bytestream, ptr, n); 199cabdff1aSopenharmony_ci bytestream += n; 200cabdff1aSopenharmony_ci ptr += linesize; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci } 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_ci if (avctx->pix_fmt == AV_PIX_FMT_YUV420P || avctx->pix_fmt == AV_PIX_FMT_YUV420P16BE) { 205cabdff1aSopenharmony_ci h >>= 1; 206cabdff1aSopenharmony_ci n >>= 1; 207cabdff1aSopenharmony_ci ptr1 = p->data[1]; 208cabdff1aSopenharmony_ci ptr2 = p->data[2]; 209cabdff1aSopenharmony_ci for (i = 0; i < h; i++) { 210cabdff1aSopenharmony_ci memcpy(bytestream, ptr1, n); 211cabdff1aSopenharmony_ci bytestream += n; 212cabdff1aSopenharmony_ci memcpy(bytestream, ptr2, n); 213cabdff1aSopenharmony_ci bytestream += n; 214cabdff1aSopenharmony_ci ptr1 += p->linesize[1]; 215cabdff1aSopenharmony_ci ptr2 += p->linesize[2]; 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci av_shrink_packet(pkt, bytestream - bytestream_start); 219cabdff1aSopenharmony_ci *got_packet = 1; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci return 0; 222cabdff1aSopenharmony_ci} 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci#if CONFIG_PGM_ENCODER 225cabdff1aSopenharmony_ciconst FFCodec ff_pgm_encoder = { 226cabdff1aSopenharmony_ci .p.name = "pgm", 227cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PGM (Portable GrayMap) image"), 228cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 229cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PGM, 230cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 231cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 232cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ 233cabdff1aSopenharmony_ci AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_NONE 234cabdff1aSopenharmony_ci }, 235cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 236cabdff1aSopenharmony_ci}; 237cabdff1aSopenharmony_ci#endif 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci#if CONFIG_PGMYUV_ENCODER 240cabdff1aSopenharmony_ciconst FFCodec ff_pgmyuv_encoder = { 241cabdff1aSopenharmony_ci .p.name = "pgmyuv", 242cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PGMYUV (Portable GrayMap YUV) image"), 243cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 244cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PGMYUV, 245cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 246cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 247cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ 248cabdff1aSopenharmony_ci AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P16BE, AV_PIX_FMT_NONE 249cabdff1aSopenharmony_ci }, 250cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 251cabdff1aSopenharmony_ci}; 252cabdff1aSopenharmony_ci#endif 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci#if CONFIG_PPM_ENCODER 255cabdff1aSopenharmony_ciconst FFCodec ff_ppm_encoder = { 256cabdff1aSopenharmony_ci .p.name = "ppm", 257cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"), 258cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 259cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PPM, 260cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 261cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 262cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ 263cabdff1aSopenharmony_ci AV_PIX_FMT_RGB24, AV_PIX_FMT_RGB48BE, AV_PIX_FMT_NONE 264cabdff1aSopenharmony_ci }, 265cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 266cabdff1aSopenharmony_ci}; 267cabdff1aSopenharmony_ci#endif 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci#if CONFIG_PBM_ENCODER 270cabdff1aSopenharmony_ciconst FFCodec ff_pbm_encoder = { 271cabdff1aSopenharmony_ci .p.name = "pbm", 272cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PBM (Portable BitMap) image"), 273cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 274cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PBM, 275cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 276cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 277cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_MONOWHITE, 278cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 279cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 280cabdff1aSopenharmony_ci}; 281cabdff1aSopenharmony_ci#endif 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci#if CONFIG_PFM_ENCODER 284cabdff1aSopenharmony_ciconst FFCodec ff_pfm_encoder = { 285cabdff1aSopenharmony_ci .p.name = "pfm", 286cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PFM (Portable FloatMap) image"), 287cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 288cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PFM, 289cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 290cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 291cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_GBRPF32LE, 292cabdff1aSopenharmony_ci AV_PIX_FMT_GRAYF32LE, 293cabdff1aSopenharmony_ci AV_PIX_FMT_GBRPF32BE, 294cabdff1aSopenharmony_ci AV_PIX_FMT_GRAYF32BE, 295cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 296cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 297cabdff1aSopenharmony_ci}; 298cabdff1aSopenharmony_ci#endif 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci#if CONFIG_PHM_ENCODER 301cabdff1aSopenharmony_cistatic av_cold int phm_enc_init(AVCodecContext *avctx) 302cabdff1aSopenharmony_ci{ 303cabdff1aSopenharmony_ci PHMEncContext *s = avctx->priv_data; 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci float2half_tables(s->basetable, s->shifttable); 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci return 0; 308cabdff1aSopenharmony_ci} 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_ciconst FFCodec ff_phm_encoder = { 311cabdff1aSopenharmony_ci .p.name = "phm", 312cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("PHM (Portable HalfFloatMap) image"), 313cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 314cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_PHM, 315cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 316cabdff1aSopenharmony_ci .priv_data_size = sizeof(PHMEncContext), 317cabdff1aSopenharmony_ci .init = phm_enc_init, 318cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pnm_encode_frame), 319cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_GBRPF32, 320cabdff1aSopenharmony_ci AV_PIX_FMT_GRAYF32, 321cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 322cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 323cabdff1aSopenharmony_ci}; 324cabdff1aSopenharmony_ci#endif 325