vo_gl: Move the read_pnm function into a separate file

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32513 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
cigaes 2010-10-18 20:44:04 +00:00 committed by Uoti Urpala
parent c640b92bdd
commit ce9fcc0730
4 changed files with 152 additions and 61 deletions

View File

@ -538,7 +538,8 @@ SRCS_MPLAYER-$(FFMPEG) += libvo/vo_png.c
SRCS_MPLAYER-$(GGI) += libvo/vo_ggi.c
SRCS_MPLAYER-$(GIF) += libvo/vo_gif89a.c
SRCS_MPLAYER-$(GL) += libvo/gl_common.c libvo/vo_gl.c \
libvo/vo_gl2.c libvo/csputils.c
libvo/vo_gl2.c libvo/csputils.c \
pnm_loader.c
SRCS_MPLAYER-$(GL_SDL) += libvo/sdl_common.c
SRCS_MPLAYER-$(GL_WIN32) += libvo/w32_common.c
SRCS_MPLAYER-$(GL_X11) += libvo/x11_common.c

View File

@ -41,6 +41,7 @@
#include "gl_common.h"
#include "csputils.h"
#include "aspect.h"
#include "pnm_loader.h"
void (GLAPIENTRY *mpglBegin)(GLenum);
void (GLAPIENTRY *mpglEnd)(void);
@ -558,66 +559,6 @@ void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLi
free(init);
}
/**
* \brief skips whitespace and comments
* \param f file to read from
*/
static void ppm_skip(FILE *f) {
int c, comment = 0;
do {
c = fgetc(f);
if (c == '#')
comment = 1;
if (c == '\n')
comment = 0;
} while (c != EOF && (isspace(c) || comment));
if (c != EOF)
ungetc(c, f);
}
#define MAXDIM (16 * 1024)
static uint8_t *read_pnm(FILE *f, int *width, int *height,
int *bytes_per_pixel, int *maxval) {
uint8_t *data;
int type;
unsigned w, h, m, val, bpp;
*width = *height = *bytes_per_pixel = *maxval = 0;
ppm_skip(f);
if (fgetc(f) != 'P')
return NULL;
type = fgetc(f);
if (type != '5' && type != '6')
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &w) != 1)
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &h) != 1)
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &m) != 1)
return NULL;
val = fgetc(f);
if (!isspace(val))
return NULL;
if (w > MAXDIM || h > MAXDIM)
return NULL;
bpp = (m > 255) ? 2 : 1;
if (type == '6')
bpp *= 3;
data = malloc(w * h * bpp);
if (fread(data, w * bpp, h, f) != h) {
free(data);
return NULL;
}
*width = w;
*height = h;
*bytes_per_pixel = bpp;
*maxval = m;
return data;
}
/**
* \brief creates a texture from a PPM file
* \param target texture taget, usually GL_TEXTURE_2D

97
pnm_loader.c Normal file
View File

@ -0,0 +1,97 @@
/*
* PNM image files loader
*
* copyleft (C) 2005-2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
*
* This file is part of MPlayer.
*
* MPlayer is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* MPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* You can alternatively redistribute this file and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*/
/**
* \file pnm_loader.c
* \brief PNM image files loader
*/
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include "pnm_loader.h"
/**
* \brief skips whitespace and comments
* \param f file to read from
*/
static void ppm_skip(FILE *f) {
int c, comment = 0;
do {
c = fgetc(f);
if (c == '#')
comment = 1;
if (c == '\n')
comment = 0;
} while (c != EOF && (isspace(c) || comment));
if (c != EOF)
ungetc(c, f);
}
#define MAXDIM (16 * 1024)
uint8_t *read_pnm(FILE *f, int *width, int *height,
int *bytes_per_pixel, int *maxval) {
uint8_t *data;
int type;
unsigned w, h, m, val, bpp;
*width = *height = *bytes_per_pixel = *maxval = 0;
ppm_skip(f);
if (fgetc(f) != 'P')
return NULL;
type = fgetc(f);
if (type != '5' && type != '6')
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &w) != 1)
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &h) != 1)
return NULL;
ppm_skip(f);
if (fscanf(f, "%u", &m) != 1)
return NULL;
val = fgetc(f);
if (!isspace(val))
return NULL;
if (w > MAXDIM || h > MAXDIM)
return NULL;
bpp = (m > 255) ? 2 : 1;
if (type == '6')
bpp *= 3;
data = malloc(w * h * bpp);
if (fread(data, w * bpp, h, f) != h) {
free(data);
return NULL;
}
*width = w;
*height = h;
*bytes_per_pixel = bpp;
*maxval = m;
return data;
}

52
pnm_loader.h Normal file
View File

@ -0,0 +1,52 @@
/*
* PNM image files loader
*
* This file is part of MPlayer.
*
* MPlayer is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* MPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* You can alternatively redistribute this file and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*/
#ifndef MPLAYER_PNM_LOADER_H
#define MPLAYER_PNM_LOADER_H
#include <stdio.h>
#include <stdint.h>
/**
* Read a "portable anymap" image.
* Supports raw PGM (P5) and PNM (P6).
*
* @param[in] f input stream.
* @param[out] width width of the loaded image.
* @param[out] height height of the loaded image.
* @param[out] bytes_per_pixel format of the loaded image.
* @param[out] maxval maximum pixel value; possible values are:
* 1 for 8 bits gray,
* 2 for 16 bits gray,
* 3 for 8 bits per component RGB,
* 6 for 16 bits per component RGB.
* @return a newly allocated array of
* width*height*bytes_per_pixel bytes,
* or NULL in case of error.
*/
uint8_t *read_pnm(FILE *f, int *width, int *height,
int *bytes_per_pixel, int *maxval);
#endif /* MPLAYER_PNM_LOADER_H */