X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fsynfig_0_61_04%2Fsynfig-core%2Fsrc%2Fmodules%2Fmod_libavcodec%2Flibavformat%2Fimg.c;fp=synfig-core%2Ftags%2Fsynfig_0_61_04%2Fsynfig-core%2Fsrc%2Fmodules%2Fmod_libavcodec%2Flibavformat%2Fimg.c;h=0000000000000000000000000000000000000000;hb=6fa8f2f38d4b0b35f8539bf94e27ae27015c7689;hp=0051271f62a335d6966f0e29c7909987c7bb0013;hpb=47fce282611fbba1044921d22ca887f9b53ad91a;p=synfig.git diff --git a/synfig-core/tags/synfig_0_61_04/synfig-core/src/modules/mod_libavcodec/libavformat/img.c b/synfig-core/tags/synfig_0_61_04/synfig-core/src/modules/mod_libavcodec/libavformat/img.c deleted file mode 100644 index 0051271..0000000 --- a/synfig-core/tags/synfig_0_61_04/synfig-core/src/modules/mod_libavcodec/libavformat/img.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Image format - * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "avformat.h" - -/* XXX: this is a hack */ -int loop_input = 0; - -typedef struct { - int width; - int height; - int img_first; - int img_last; - int img_number; - int img_count; - int img_size; - AVImageFormat *img_fmt; - int pix_fmt; - int is_pipe; - char path[1024]; - /* temporary usage */ - void *ptr; -} VideoData; - - -/* return -1 if no image found */ -static int find_image_range(int *pfirst_index, int *plast_index, - const char *path) -{ - char buf[1024]; - int range, last_index, range1, first_index; - - /* find the first image */ - for(first_index = 0; first_index < 5; first_index++) { - if (get_frame_filename(buf, sizeof(buf), path, first_index) < 0) - goto fail; - if (url_exist(buf)) - break; - } - if (first_index == 5) - goto fail; - - /* find the last image */ - last_index = first_index; - for(;;) { - range = 0; - for(;;) { - if (!range) - range1 = 1; - else - range1 = 2 * range; - if (get_frame_filename(buf, sizeof(buf), path, - last_index + range1) < 0) - goto fail; - if (!url_exist(buf)) - break; - range = range1; - /* just in case... */ - if (range >= (1 << 30)) - goto fail; - } - /* we are sure than image last_index + range exists */ - if (!range) - break; - last_index += range; - } - *pfirst_index = first_index; - *plast_index = last_index; - return 0; - fail: - return -1; -} - - -static int image_probe(AVProbeData *p) -{ - if (filename_number_test(p->filename) >= 0 && guess_image_format(p->filename)) - return AVPROBE_SCORE_MAX; - else - return 0; -} - -static int read_header_alloc_cb(void *opaque, AVImageInfo *info) -{ - VideoData *s = opaque; - - s->width = info->width; - s->height = info->height; - s->pix_fmt = info->pix_fmt; - /* stop image reading but no error */ - return 1; -} - -static int img_read_header(AVFormatContext *s1, AVFormatParameters *ap) -{ - VideoData *s = s1->priv_data; - int ret, first_index, last_index; - char buf[1024]; - ByteIOContext pb1, *f = &pb1; - AVStream *st; - - st = av_new_stream(s1, 0); - if (!st) { - av_free(s); - return -ENOMEM; - } - - if (ap && ap->image_format) - s->img_fmt = ap->image_format; - - strcpy(s->path, s1->filename); - s->img_number = 0; - s->img_count = 0; - - /* find format */ - if (s1->iformat->flags & AVFMT_NOFILE) - s->is_pipe = 0; - else - s->is_pipe = 1; - - if (!ap || !ap->frame_rate) { - st->codec.frame_rate = 25; - st->codec.frame_rate_base = 1; - } else { - st->codec.frame_rate = ap->frame_rate; - st->codec.frame_rate_base = ap->frame_rate_base; - } - - if (!s->is_pipe) { - if (find_image_range(&first_index, &last_index, s->path) < 0) - goto fail; - s->img_first = first_index; - s->img_last = last_index; - s->img_number = first_index; - /* compute duration */ - st->start_time = 0; - st->duration = ((int64_t)AV_TIME_BASE * - (last_index - first_index + 1) * - st->codec.frame_rate_base) / st->codec.frame_rate; - if (get_frame_filename(buf, sizeof(buf), s->path, s->img_number) < 0) - goto fail; - if (url_fopen(f, buf, URL_RDONLY) < 0) - goto fail; - } else { - f = &s1->pb; - } - - ret = av_read_image(f, s1->filename, s->img_fmt, read_header_alloc_cb, s); - if (ret < 0) - goto fail1; - - if (!s->is_pipe) { - url_fclose(f); - } else { - url_fseek(f, 0, SEEK_SET); - } - - 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 = s->pix_fmt; - s->img_size = avpicture_get_size(s->pix_fmt, s->width, s->height); - - return 0; - fail1: - if (!s->is_pipe) - url_fclose(f); - fail: - av_free(s); - return -EIO; -} - -static int read_packet_alloc_cb(void *opaque, AVImageInfo *info) -{ - VideoData *s = opaque; - - if (info->width != s->width || - info->height != s->height) - return -1; - avpicture_fill(&info->pict, s->ptr, info->pix_fmt, info->width, info->height); - return 0; -} - -static int img_read_packet(AVFormatContext *s1, AVPacket *pkt) -{ - VideoData *s = s1->priv_data; - char filename[1024]; - int ret; - ByteIOContext f1, *f; - - if (!s->is_pipe) { - /* loop over input */ - if (loop_input && s->img_number > s->img_last) { - s->img_number = s->img_first; - } - if (get_frame_filename(filename, sizeof(filename), - s->path, s->img_number) < 0) - return -EIO; - f = &f1; - if (url_fopen(f, filename, URL_RDONLY) < 0) - return -EIO; - } else { - f = &s1->pb; - if (url_feof(f)) - return -EIO; - } - - av_new_packet(pkt, s->img_size); - pkt->stream_index = 0; - - s->ptr = pkt->data; - ret = av_read_image(f, filename, s->img_fmt, read_packet_alloc_cb, s); - if (!s->is_pipe) { - url_fclose(f); - } - - if (ret < 0) { - av_free_packet(pkt); - return -EIO; /* signal EOF */ - } else { - /* XXX: computing this pts is not necessary as it is done in - the generic code too */ - pkt->pts = av_rescale((int64_t)s->img_count * s1->streams[0]->codec.frame_rate_base, s1->pts_den, s1->streams[0]->codec.frame_rate) / s1->pts_num; - s->img_count++; - s->img_number++; - return 0; - } -} - -static int img_read_close(AVFormatContext *s1) -{ - return 0; -} - -/******************************************************/ -/* image output */ - -static int img_set_parameters(AVFormatContext *s, AVFormatParameters *ap) -{ - VideoData *img = s->priv_data; - AVStream *st; - AVImageFormat *img_fmt; - int i; - - /* find output image format */ - if (ap && ap->image_format) { - img_fmt = ap->image_format; - } else { - img_fmt = guess_image_format(s->filename); - } - if (!img_fmt) - return -1; - - if (s->nb_streams != 1) - return -1; - - st = s->streams[0]; - /* we select the first matching format */ - for(i=0;isupported_pixel_formats & (1 << i)) - break; - } - if (i >= PIX_FMT_NB) - return -1; - img->img_fmt = img_fmt; - img->pix_fmt = i; - st->codec.pix_fmt = img->pix_fmt; - return 0; -} - -static int img_write_header(AVFormatContext *s) -{ - VideoData *img = s->priv_data; - - img->img_number = 1; - strcpy(img->path, s->filename); - - /* find format */ - if (s->oformat->flags & AVFMT_NOFILE) - img->is_pipe = 0; - else - img->is_pipe = 1; - - return 0; -} - -static int img_write_packet(AVFormatContext *s, int stream_index, - const uint8_t *buf, int size, int64_t pts) -{ - VideoData *img = s->priv_data; - AVStream *st = s->streams[stream_index]; - ByteIOContext pb1, *pb; - AVPicture *picture; - int width, height, ret; - char filename[1024]; - AVImageInfo info; - - width = st->codec.width; - height = st->codec.height; - - picture = (AVPicture *)buf; - - if (!img->is_pipe) { - if (get_frame_filename(filename, sizeof(filename), - img->path, img->img_number) < 0) - return -EIO; - pb = &pb1; - if (url_fopen(pb, filename, URL_WRONLY) < 0) - return -EIO; - } else { - pb = &s->pb; - } - info.width = width; - info.height = height; - info.pix_fmt = st->codec.pix_fmt; - info.pict = *picture; - ret = av_write_image(pb, img->img_fmt, &info); - if (!img->is_pipe) { - url_fclose(pb); - } - - img->img_number++; - return 0; -} - -static int img_write_trailer(AVFormatContext *s) -{ - return 0; -} - -/* input */ - -static AVInputFormat image_iformat = { - "image", - "image sequence", - sizeof(VideoData), - image_probe, - img_read_header, - img_read_packet, - img_read_close, - NULL, - AVFMT_NOFILE | AVFMT_NEEDNUMBER, -}; - -static AVInputFormat imagepipe_iformat = { - "imagepipe", - "piped image sequence", - sizeof(VideoData), - NULL, /* no probe */ - img_read_header, - img_read_packet, - img_read_close, - NULL, -}; - - -/* output */ - -static AVOutputFormat image_oformat = { - "image", - "image sequence", - "", - "", - sizeof(VideoData), - CODEC_ID_NONE, - CODEC_ID_RAWVIDEO, - img_write_header, - img_write_packet, - img_write_trailer, - AVFMT_NOFILE | AVFMT_NEEDNUMBER | AVFMT_RAWPICTURE, - img_set_parameters, -}; - -static AVOutputFormat imagepipe_oformat = { - "imagepipe", - "piped image sequence", - "", - "", - sizeof(VideoData), - CODEC_ID_NONE, - CODEC_ID_RAWVIDEO, - img_write_header, - img_write_packet, - img_write_trailer, - AVFMT_RAWPICTURE, - img_set_parameters, -}; - -int img_init(void) -{ - av_register_input_format(&image_iformat); - av_register_output_format(&image_oformat); - - av_register_input_format(&imagepipe_iformat); - av_register_output_format(&imagepipe_oformat); - - return 0; -}