static int img_read_packet(AVFormatContext *s1, AVPacket *pkt) { VideoData *s = s1->priv_data; char filename[1024]; int i; int size[3]={0}, ret[3]={0}; ByteIOContext f1[3], *f[3]= {&f1[0], &f1[1], &f1[2]}; AVCodecContext *codec= &s1->streams[0]->codec; 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 && s->img_number > 1) return AVERROR_IO; for(i=0; i<3; i++){ if (url_fopen(f[i], filename, URL_RDONLY) < 0) return AVERROR_IO; size[i]= url_filesize(url_fileno(f[i])); if(codec->codec_id != CODEC_ID_RAWVIDEO) break; filename[ strlen(filename) - 1 ]= 'U' + i; } if(codec->codec_id == CODEC_ID_RAWVIDEO && !codec->width) infer_size(&codec->width, &codec->height, size[0]); } else { f[0] = &s1->pb; if (url_feof(f[0])) return AVERROR_IO; size[0]= 4096; } av_new_packet(pkt, size[0] + size[1] + size[2]); pkt->stream_index = 0; pkt->flags |= PKT_FLAG_KEY; pkt->size= 0; for(i=0; i<3; i++){ if(size[i]){ ret[i]= get_buffer(f[i], pkt->data + pkt->size, size[i]); if (!s->is_pipe) url_fclose(f[i]); if(ret[i]>0) pkt->size += ret[i]; } } if (ret[0] <= 0 || ret[1]<0 || ret[2]<0) { av_free_packet(pkt); return AVERROR_IO; /* signal EOF */ } else { s->img_count++; s->img_number++; return 0; } }
static int yuv_read(ByteIOContext *f, int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque) { ByteIOContext pb1, *pb = &pb1; int img_size, ret; char fname[1024], *p; int size; URLContext *h; AVImageInfo info1, *info = &info1; img_size = url_fsize(f); /* XXX: hack hack */ h = url_fileno(f); url_get_filename(h, fname, sizeof(fname)); if (infer_size(&info->width, &info->height, img_size) < 0) { return AVERROR_IO; } info->pix_fmt = PIX_FMT_YUV420P; ret = alloc_cb(opaque, info); if (ret) return ret; size = info->width * info->height; p = strrchr(fname, '.'); if (!p || p[1] != 'Y') return AVERROR_IO; get_buffer(f, info->pict.data[0], size); p[1] = 'U'; if (url_fopen(pb, fname, URL_RDONLY) < 0) return AVERROR_IO; get_buffer(pb, info->pict.data[1], size / 4); url_fclose(pb); p[1] = 'V'; if (url_fopen(pb, fname, URL_RDONLY) < 0) return AVERROR_IO; get_buffer(pb, info->pict.data[2], size / 4); url_fclose(pb); 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 && s->img_number > 1) return AVERROR_IO; f = &f1; if (url_fopen(f, filename, URL_RDONLY) < 0) return AVERROR_IO; } else { f = &s1->pb; if (url_feof(f)) return AVERROR_IO; } if (s->is_pipe) { av_new_packet(pkt, 4096); }else{ av_new_packet(pkt, url_filesize(url_fileno(f))); } pkt->stream_index = 0; pkt->flags |= PKT_FLAG_KEY; ret = get_buffer(f, pkt->data, pkt->size); if (!s->is_pipe) { url_fclose(f); } if (ret <= 0) { av_free_packet(pkt); return AVERROR_IO; /* signal EOF */ } else { s->img_count++; s->img_number++; return 0; } }
static int yuv_write(ByteIOContext *pb2, AVImageInfo *info) { ByteIOContext pb1, *pb; char fname[1024], *p; int i, j, width, height; uint8_t *ptr; URLContext *h; static const char *ext = "YUV"; /* XXX: hack hack */ h = url_fileno(pb2); url_get_filename(h, fname, sizeof(fname)); p = strrchr(fname, '.'); if (!p || p[1] != 'Y') return AVERROR_IO; width = info->width; height = info->height; for(i=0;i<3;i++) { if (i == 1) { width >>= 1; height >>= 1; } if (i >= 1) { pb = &pb1; p[1] = ext[i]; if (url_fopen(pb, fname, URL_WRONLY) < 0) return AVERROR_IO; } else { pb = pb2; } ptr = info->pict.data[i]; for(j=0;j<height;j++) { put_buffer(pb, ptr, width); ptr += info->pict.linesize[i]; } put_flush_packet(pb); if (i >= 1) { url_fclose(pb); } }