avcodec: add PFM image encoder
This commit is contained in:
		
							parent
							
								
									090f31f813
								
							
						
					
					
						commit
						85bdf18917
					
				| @ -62,6 +62,7 @@ version <next>: | |||||||
| - kirsch filter | - kirsch filter | ||||||
| - colortemperature filter | - colortemperature filter | ||||||
| - colorcontrast filter | - colorcontrast filter | ||||||
|  | - PFM encoder | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| version 4.3: | version 4.3: | ||||||
|  | |||||||
| @ -545,6 +545,7 @@ OBJS-$(CONFIG_PBM_ENCODER)             += pnmenc.o | |||||||
| OBJS-$(CONFIG_PCX_DECODER)             += pcx.o | OBJS-$(CONFIG_PCX_DECODER)             += pcx.o | ||||||
| OBJS-$(CONFIG_PCX_ENCODER)             += pcxenc.o | OBJS-$(CONFIG_PCX_ENCODER)             += pcxenc.o | ||||||
| OBJS-$(CONFIG_PFM_DECODER)             += pnmdec.o pnm.o | OBJS-$(CONFIG_PFM_DECODER)             += pnmdec.o pnm.o | ||||||
|  | OBJS-$(CONFIG_PFM_ENCODER)             += pnmenc.o | ||||||
| OBJS-$(CONFIG_PGM_DECODER)             += pnmdec.o pnm.o | OBJS-$(CONFIG_PGM_DECODER)             += pnmdec.o pnm.o | ||||||
| OBJS-$(CONFIG_PGM_ENCODER)             += pnmenc.o | OBJS-$(CONFIG_PGM_ENCODER)             += pnmenc.o | ||||||
| OBJS-$(CONFIG_PGMYUV_DECODER)          += pnmdec.o pnm.o | OBJS-$(CONFIG_PGMYUV_DECODER)          += pnmdec.o pnm.o | ||||||
|  | |||||||
| @ -239,6 +239,7 @@ extern AVCodec ff_pbm_encoder; | |||||||
| extern AVCodec ff_pbm_decoder; | extern AVCodec ff_pbm_decoder; | ||||||
| extern AVCodec ff_pcx_encoder; | extern AVCodec ff_pcx_encoder; | ||||||
| extern AVCodec ff_pcx_decoder; | extern AVCodec ff_pcx_decoder; | ||||||
|  | extern AVCodec ff_pfm_encoder; | ||||||
| extern AVCodec ff_pfm_decoder; | extern AVCodec ff_pfm_decoder; | ||||||
| extern AVCodec ff_pgm_encoder; | extern AVCodec ff_pgm_encoder; | ||||||
| extern AVCodec ff_pgm_decoder; | extern AVCodec ff_pgm_decoder; | ||||||
|  | |||||||
| @ -19,6 +19,7 @@ | |||||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #include "libavutil/intreadwrite.h" | ||||||
| #include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||||
| #include "avcodec.h" | #include "avcodec.h" | ||||||
| @ -77,19 +78,46 @@ static int pnm_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||||
|         n  = avctx->width * 2; |         n  = avctx->width * 2; | ||||||
|         h1 = (h * 3) / 2; |         h1 = (h * 3) / 2; | ||||||
|         break; |         break; | ||||||
|  |     case AV_PIX_FMT_GBRPF32: | ||||||
|  |         c  = 'F'; | ||||||
|  |         n  = avctx->width * 4; | ||||||
|  |         break; | ||||||
|     default: |     default: | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|     snprintf(bytestream, bytestream_end - bytestream, |     snprintf(bytestream, bytestream_end - bytestream, | ||||||
|              "P%c\n%d %d\n", c, avctx->width, h1); |              "P%c\n%d %d\n", c, avctx->width, h1); | ||||||
|     bytestream += strlen(bytestream); |     bytestream += strlen(bytestream); | ||||||
|     if (avctx->pix_fmt != AV_PIX_FMT_MONOWHITE) { |     if (avctx->pix_fmt == AV_PIX_FMT_GBRPF32) | ||||||
|  |         snprintf(bytestream, bytestream_end - bytestream, | ||||||
|  |                  "%f\n", avctx->pix_fmt == AV_PIX_FMT_GBRPF32BE ? 1.f: -1.f); | ||||||
|  |     bytestream += strlen(bytestream); | ||||||
|  |     if (avctx->pix_fmt != AV_PIX_FMT_MONOWHITE && | ||||||
|  |         avctx->pix_fmt != AV_PIX_FMT_GBRPF32) { | ||||||
|         int maxdepth = (1 << av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth) - 1; |         int maxdepth = (1 << av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth) - 1; | ||||||
|         snprintf(bytestream, bytestream_end - bytestream, |         snprintf(bytestream, bytestream_end - bytestream, | ||||||
|                  "%d\n", maxdepth); |                  "%d\n", maxdepth); | ||||||
|         bytestream += strlen(bytestream); |         bytestream += strlen(bytestream); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (avctx->pix_fmt == AV_PIX_FMT_GBRPF32) { | ||||||
|  |         float *r = (float *)p->data[2]; | ||||||
|  |         float *g = (float *)p->data[0]; | ||||||
|  |         float *b = (float *)p->data[1]; | ||||||
|  | 
 | ||||||
|  |         for (int i = 0; i < avctx->height; i++) { | ||||||
|  |             for (int j = 0; j < avctx->width; j++) { | ||||||
|  |                 AV_WN32(bytestream + 0, av_float2int(r[j])); | ||||||
|  |                 AV_WN32(bytestream + 4, av_float2int(g[j])); | ||||||
|  |                 AV_WN32(bytestream + 8, av_float2int(b[j])); | ||||||
|  |                 bytestream += 12; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             r += p->linesize[2] / 4; | ||||||
|  |             g += p->linesize[0] / 4; | ||||||
|  |             b += p->linesize[1] / 4; | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|     ptr      = p->data[0]; |     ptr      = p->data[0]; | ||||||
|     linesize = p->linesize[0]; |     linesize = p->linesize[0]; | ||||||
|     for (i = 0; i < h; i++) { |     for (i = 0; i < h; i++) { | ||||||
| @ -97,6 +125,7 @@ static int pnm_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||||
|         bytestream += n; |         bytestream += n; | ||||||
|         ptr        += linesize; |         ptr        += linesize; | ||||||
|     } |     } | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     if (avctx->pix_fmt == AV_PIX_FMT_YUV420P || avctx->pix_fmt == AV_PIX_FMT_YUV420P16BE) { |     if (avctx->pix_fmt == AV_PIX_FMT_YUV420P || avctx->pix_fmt == AV_PIX_FMT_YUV420P16BE) { | ||||||
|         h >>= 1; |         h >>= 1; | ||||||
| @ -189,3 +218,17 @@ AVCodec ff_pbm_encoder = { | |||||||
|     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, |     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, | ||||||
| }; | }; | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  | #if CONFIG_PFM_ENCODER | ||||||
|  | AVCodec ff_pfm_encoder = { | ||||||
|  |     .name           = "pfm", | ||||||
|  |     .long_name      = NULL_IF_CONFIG_SMALL("PFM (Portable FloatMap) image"), | ||||||
|  |     .type           = AVMEDIA_TYPE_VIDEO, | ||||||
|  |     .id             = AV_CODEC_ID_PFM, | ||||||
|  |     .init           = pnm_encode_init, | ||||||
|  |     .encode2        = pnm_encode_frame, | ||||||
|  |     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_GBRPF32, | ||||||
|  |                                                     AV_PIX_FMT_NONE }, | ||||||
|  |     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ | |||||||
| #include "libavutil/version.h" | #include "libavutil/version.h" | ||||||
| 
 | 
 | ||||||
| #define LIBAVCODEC_VERSION_MAJOR  58 | #define LIBAVCODEC_VERSION_MAJOR  58 | ||||||
| #define LIBAVCODEC_VERSION_MINOR 119 | #define LIBAVCODEC_VERSION_MINOR 120 | ||||||
| #define LIBAVCODEC_VERSION_MICRO 100 | #define LIBAVCODEC_VERSION_MICRO 100 | ||||||
| 
 | 
 | ||||||
| #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||||
|  | |||||||
| @ -260,7 +260,7 @@ static const AVClass img2mux_class = { | |||||||
| AVOutputFormat ff_image2_muxer = { | AVOutputFormat ff_image2_muxer = { | ||||||
|     .name           = "image2", |     .name           = "image2", | ||||||
|     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"), |     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"), | ||||||
|     .extensions     = "bmp,dpx,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png," |     .extensions     = "bmp,dpx,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,png," | ||||||
|                       "ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24," |                       "ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24," | ||||||
|                       "sunras,xbm,xface,pix,y", |                       "sunras,xbm,xface,pix,y", | ||||||
|     .priv_data_size = sizeof(VideoMuxData), |     .priv_data_size = sizeof(VideoMuxData), | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user