static int siff_parse_vbv1(AVFormatContext *s, SIFFContext *c, AVIOContext *pb) { AVStream *st; int width, height; if (avio_rl32(pb) != TAG_VBHD) { av_log(s, AV_LOG_ERROR, "Header chunk is missing\n"); return -1; } if(avio_rb32(pb) != 32) { av_log(s, AV_LOG_ERROR, "Header chunk size is incorrect\n"); return -1; } if(avio_rl16(pb) != 1) { av_log(s, AV_LOG_ERROR, "Incorrect header version\n"); return -1; } width = avio_rl16(pb); height = avio_rl16(pb); avio_skip(pb, 4); c->frames = avio_rl16(pb); if(!c->frames) { av_log(s, AV_LOG_ERROR, "File contains no frames ???\n"); return -1; } c->bits = avio_rl16(pb); c->rate = avio_rl16(pb); c->block_align = c->rate * (c->bits >> 3); avio_skip(pb, 16); //zeroes st = av_new_stream(s, 0); if (!st) return -1; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = CODEC_ID_VB; st->codec->codec_tag = MKTAG('V', 'B', 'V', '1'); st->codec->width = width; st->codec->height = height; st->codec->pix_fmt = PIX_FMT_PAL8; av_set_pts_info(st, 16, 1, 12); c->cur_frame = 0; c->has_video = 1; c->has_audio = !!c->rate; c->curstrm = -1; if (c->has_audio && create_audio_stream(s, c) < 0) return -1; return 0; }
static int siff_parse_soun(AVFormatContext *s, SIFFContext *c, ByteIOContext *pb) { if (get_le32(pb) != TAG_SHDR){ av_log(s, AV_LOG_ERROR, "Header chunk is missing\n"); return -1; } if(get_be32(pb) != 8){ av_log(s, AV_LOG_ERROR, "Header chunk size is incorrect\n"); return -1; } url_fskip(pb, 4); //unknown value c->rate = get_le16(pb); c->bits = get_le16(pb); c->block_align = c->rate * (c->bits >> 3); return create_audio_stream(s, c); }
static bool init_streams(struct ffmpeg_mux *ffm) { if (ffm->params.has_video) create_video_stream(ffm); if (ffm->params.tracks) { ffm->audio_streams = calloc(1, ffm->params.tracks * sizeof(void*)); for (int i = 0; i < ffm->params.tracks; i++) create_audio_stream(ffm, i); } if (!ffm->video_stream && !ffm->num_audio_streams) return false; return true; }