#define IMGFMT_YUV 1
#define IMGFMT_PGMYUV 2
#define IMGFMT_PGM 3
+#define IMGFMT_PPM 4
typedef struct {
int width;
return 0;
}
+static int ppm_read(VideoData *s, ByteIOContext *f, UINT8 *buf, int size)
+{
+ int width, height;
+ char buf1[32];
+ UINT8 *picture[3];
+
+ width = s->width;
+ height = s->height;
+
+ pnm_get(f, buf1, sizeof(buf1));
+ if (strcmp(buf1, "P6")) {
+ return -EIO;
+ }
+
+ pnm_get(f, buf1, sizeof(buf1));
+ pnm_get(f, buf1, sizeof(buf1));
+ pnm_get(f, buf1, sizeof(buf1));
+
+ picture[0] = buf;
+ get_buffer(f, picture[0], width * height*3);
+
+ return 0;
+
+}
+
static int yuv_read(VideoData *s, const char *filename, UINT8 *buf, int size1)
{
ByteIOContext pb1, *pb = &pb1;
case IMGFMT_YUV:
ret = yuv_read(s, filename, pkt->data, pkt->size);
break;
+ case IMGFMT_PPM:
+ ret = ppm_read(s, f, pkt->data, pkt->size);
+ break;
default:
return -EIO;
}
else
s->is_pipe = 1;
- if (s1->format == &pgmpipe_format ||
+ if (s1->format == &pgmyuvpipe_format ||
s1->format == &pgmyuv_format)
s->img_fmt = IMGFMT_PGMYUV;
- else if (s1->format == &pgm_format)
+ else if (s1->format == &pgmpipe_format ||
+ s1->format == &pgm_format)
s->img_fmt = IMGFMT_PGM;
else if (s1->format == &imgyuv_format)
s->img_fmt = IMGFMT_YUV;
+ else if (s1->format == &ppmpipe_format ||
+ s1->format == &ppm_format)
+ s->img_fmt = IMGFMT_PPM;
else
goto fail;
switch(s->img_fmt) {
case IMGFMT_PGM:
case IMGFMT_PGMYUV:
+ case IMGFMT_PPM:
pnm_get(f, buf1, sizeof(buf1));
pnm_get(f, buf1, sizeof(buf1));
s->width = atoi(buf1);
url_fseek(f, 0, SEEK_SET);
}
- s->img_size = (s->width * s->height * 3) / 2;
st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_RAWVIDEO;
st->codec.width = s->width;
st->codec.height = s->height;
- st->codec.pix_fmt = PIX_FMT_YUV420P;
+ if (s->img_fmt == IMGFMT_PPM) {
+ st->codec.pix_fmt = PIX_FMT_RGB24;
+ s->img_size = (s->width * s->height * 3);
+ } else {
+ st->codec.pix_fmt = PIX_FMT_YUV420P;
+ s->img_size = (s->width * s->height * 3) / 2;
+ }
if (!ap || !ap->frame_rate)
st->codec.frame_rate = 25 * FRAME_RATE_BASE;
else
/******************************************************/
/* image output */
-int pgm_save(AVPicture *picture, int width, int height, ByteIOContext *pb, int is_yuv)
+static int pgm_save(AVPicture *picture, int width, int height, ByteIOContext *pb, int is_yuv)
{
int i, h;
char buf[100];
return 0;
}
+static int ppm_save(AVPicture *picture, int width, int height, ByteIOContext *pb)
+{
+ int i;
+ char buf[100];
+ UINT8 *ptr;
+
+ snprintf(buf, sizeof(buf),
+ "P6\n%d %d\n%d\n",
+ width, height, 255);
+ put_buffer(pb, buf, strlen(buf));
+
+ ptr = picture->data[0];
+ for(i=0;i<height;i++) {
+ put_buffer(pb, ptr, width * 3);
+ ptr += picture->linesize[0];
+ }
+
+ put_flush_packet(pb);
+ return 0;
+}
+
static int yuv_save(AVPicture *picture, int width, int height, const char *filename)
{
ByteIOContext pb1, *pb = &pb1;
else
img->is_pipe = 1;
- if (s->format == &pgmpipe_format ||
- s->format == &pgmyuv_format)
+ if (s->format == &pgmyuvpipe_format ||
+ s->format == &pgmyuv_format) {
img->img_fmt = IMGFMT_PGMYUV;
- else if (s->format == &pgm_format)
+ } else if (s->format == &pgmpipe_format ||
+ s->format == &pgm_format) {
img->img_fmt = IMGFMT_PGM;
- else if (s->format == &imgyuv_format)
+ } else if (s->format == &imgyuv_format) {
img->img_fmt = IMGFMT_YUV;
- else
+ } else if (s->format == &ppmpipe_format ||
+ s->format == &ppm_format) {
+ img->img_fmt = IMGFMT_PPM;
+ } else {
goto fail;
+ }
return 0;
fail:
free(img);
width = st->codec.width;
height = st->codec.height;
- size1 = (width * height * 3) / 2;
- if (size != size1)
- return -EIO;
- picture.data[0] = buf;
- picture.data[1] = picture.data[0] + width * height;
- picture.data[2] = picture.data[1] + (width * height) / 4;
- picture.linesize[0] = width;
- picture.linesize[1] = width >> 1;
- picture.linesize[2] = width >> 1;
+ switch(st->codec.pix_fmt) {
+ case PIX_FMT_YUV420P:
+ size1 = (width * height * 3) / 2;
+ if (size != size1)
+ return -EIO;
+
+ picture.data[0] = buf;
+ picture.data[1] = picture.data[0] + width * height;
+ picture.data[2] = picture.data[1] + (width * height) / 4;
+ picture.linesize[0] = width;
+ picture.linesize[1] = width >> 1;
+ picture.linesize[2] = width >> 1;
+ break;
+ case PIX_FMT_RGB24:
+ size1 = (width * height * 3);
+ if (size != size1)
+ return -EIO;
+ picture.data[0] = buf;
+ picture.linesize[0] = width * 3;
+ break;
+ default:
+ return -EIO;
+ }
+
snprintf(filename, sizeof(filename), img->path, img->img_number);
if (!img->is_pipe) {
case IMGFMT_YUV:
ret = yuv_save(&picture, width, height, filename);
break;
+ case IMGFMT_PPM:
+ ret = ppm_save(&picture, width, height, pb);
+ break;
}
if (!img->is_pipe) {
url_fclose(pb);
AVFMT_NOFILE,
};
+AVFormat ppm_format = {
+ "ppm",
+ "ppm image format",
+ "",
+ "ppm",
+ CODEC_ID_NONE,
+ CODEC_ID_RAWVIDEO,
+ img_write_header,
+ img_write_packet,
+ img_write_trailer,
+
+ img_read_header,
+ img_read_packet,
+ img_read_close,
+ NULL,
+ AVFMT_NOFILE,
+};
+
AVFormat imgyuv_format = {
".Y.U.V",
".Y.U.V format",
img_read_close,
NULL,
};
+
+AVFormat pgmyuvpipe_format = {
+ "pgmyuvpipe",
+ "PGM YUV pipe format",
+ "",
+ "pgm",
+ CODEC_ID_NONE,
+ CODEC_ID_RAWVIDEO,
+ img_write_header,
+ img_write_packet,
+ img_write_trailer,
+
+ img_read_header,
+ img_read_packet,
+ img_read_close,
+ NULL,
+};
+
+AVFormat ppmpipe_format = {
+ "ppmpipe",
+ "PPM pipe format",
+ "",
+ "ppm",
+ CODEC_ID_NONE,
+ CODEC_ID_RAWVIDEO,
+ img_write_header,
+ img_write_packet,
+ img_write_trailer,
+
+ img_read_header,
+ img_read_packet,
+ img_read_close,
+ NULL,
+};