static int adx_read_header(AVFormatContext *s) { ADXDemuxerContext *c = s->priv_data; AVCodecContext *avctx; AVStream *st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); avctx = s->streams[0]->codec; if (avio_rb16(s->pb) != 0x8000) return AVERROR_INVALIDDATA; c->header_size = avio_rb16(s->pb) + 4; avio_seek(s->pb, -4, SEEK_CUR); if (ff_get_extradata(avctx, s->pb, c->header_size) < 0) return AVERROR(ENOMEM); if (avctx->extradata_size < 12) { av_log(s, AV_LOG_ERROR, "Invalid extradata size.\n"); return AVERROR_INVALIDDATA; } avctx->sample_rate = AV_RB32(avctx->extradata + 8); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = s->iformat->raw_codec_id; avpriv_set_pts_info(st, 64, BLOCK_SAMPLES, avctx->sample_rate); return 0; }
static int read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size, pts, type; retry: type = avio_rb16(s->pb); // 257 or 258 size = avio_rb16(s->pb); avio_rb16(s->pb); //some flags, 0x80 indicates end of frame avio_rb16(s->pb); //packet number pts = avio_rb32(s->pb); avio_rb32(s->pb); //6A 13 E3 88 size -= 12; if(size < 1) return -1; if(type == 258) { avio_skip(s->pb, size); goto retry; } ret = av_get_packet(s->pb, pkt, size); pkt->pts = pts; pkt->pos -= 16; pkt->stream_index = 0; return ret; }
static int cdata_read_header(AVFormatContext *s, AVFormatParameters *ap) { CdataDemuxContext *cdata = s->priv_data; AVIOContext *pb = s->pb; unsigned int sample_rate, header; AVStream *st; header = avio_rb16(pb); switch (header) { case 0x0400: cdata->channels = 1; break; case 0x0404: cdata->channels = 2; break; case 0x040C: cdata->channels = 4; break; default: av_log(s, AV_LOG_INFO, "unknown header 0x%04x\n", header); return -1; }; sample_rate = avio_rb16(pb); avio_skip(pb, 12); st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = 0; /* no fourcc */ st->codec->codec_id = CODEC_ID_ADPCM_EA_XAS; st->codec->channels = cdata->channels; st->codec->sample_rate = sample_rate; av_set_pts_info(st, 64, 1, sample_rate); cdata->audio_pts = 0; return 0; }
int ff_rm_read_mdpr_codecdata (AVFormatContext *s, AVIOContext *pb, AVStream *st, RMStream *rst, int codec_data_size) { unsigned int v; int size; int64_t codec_pos; int ret; avpriv_set_pts_info(st, 64, 1, 1000); codec_pos = avio_tell(pb); v = avio_rb32(pb); if (v == MKTAG(0xfd, 'a', 'r', '.')) { /* ra type header */ if (rm_read_audio_stream_info(s, pb, st, rst, 0)) return -1; } else if (v == MKBETAG('L', 'S', 'D', ':')) { avio_seek(pb, -4, SEEK_CUR); if ((ret = rm_read_extradata(pb, st->codec, codec_data_size)) < 0) return ret; st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = AV_RL32(st->codec->extradata); st->codec->codec_id = ff_codec_get_id(ff_rm_codec_tags, st->codec->codec_tag); } else { int fps; if (avio_rl32(pb) != MKTAG('V', 'I', 'D', 'O')) { fail1: av_log(st->codec, AV_LOG_ERROR, "Unsupported video codec\n"); goto skip; } st->codec->codec_tag = avio_rl32(pb); st->codec->codec_id = ff_codec_get_id(ff_rm_codec_tags, st->codec->codec_tag); av_dlog(s, "%X %X\n", st->codec->codec_tag, MKTAG('R', 'V', '2', '0')); if (st->codec->codec_id == AV_CODEC_ID_NONE) goto fail1; st->codec->width = avio_rb16(pb); st->codec->height = avio_rb16(pb); avio_skip(pb, 2); // looks like bits per sample avio_skip(pb, 4); // always zero? st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS; fps = avio_rb32(pb); if ((ret = rm_read_extradata(pb, st->codec, codec_data_size - (avio_tell(pb) - codec_pos))) < 0) return ret; av_reduce(&st->avg_frame_rate.den, &st->avg_frame_rate.num, 0x10000, fps, (1 << 30) - 1); } skip: /* skip codec info */ size = avio_tell(pb) - codec_pos; avio_skip(pb, codec_data_size - size); return 0; }
static int r3d_read_red1(AVFormatContext *s) { AVStream *st = av_new_stream(s, 0); char filename[258]; int tmp; int av_unused tmp2; if (!st) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = CODEC_ID_JPEG2000; tmp = avio_r8(s->pb); // major version tmp2 = avio_r8(s->pb); // minor version av_dlog(s, "version %d.%d\n", tmp, tmp2); tmp = avio_rb16(s->pb); // unknown av_dlog(s, "unknown1 %d\n", tmp); tmp = avio_rb32(s->pb); av_set_pts_info(st, 32, 1, tmp); tmp = avio_rb32(s->pb); // filenum av_dlog(s, "filenum %d\n", tmp); avio_skip(s->pb, 32); // unknown st->codec->width = avio_rb32(s->pb); st->codec->height = avio_rb32(s->pb); tmp = avio_rb16(s->pb); // unknown av_dlog(s, "unknown2 %d\n", tmp); st->codec->time_base.den = avio_rb16(s->pb); st->codec->time_base.num = avio_rb16(s->pb); tmp = avio_r8(s->pb); // audio channels av_dlog(s, "audio channels %d\n", tmp); if (tmp > 0) { AVStream *ast = av_new_stream(s, 1); if (!ast) return AVERROR(ENOMEM); ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; ast->codec->codec_id = CODEC_ID_PCM_S32BE; ast->codec->channels = tmp; av_set_pts_info(ast, 32, 1, st->time_base.den); } avio_read(s->pb, filename, 257); filename[sizeof(filename)-1] = 0; av_dict_set(&st->metadata, "filename", filename, 0); av_dlog(s, "filename %s\n", filename); av_dlog(s, "resolution %dx%d\n", st->codec->width, st->codec->height); av_dlog(s, "timescale %d\n", st->time_base.den); av_dlog(s, "frame rate %d/%d\n", st->codec->time_base.num, st->codec->time_base.den); return 0; }
/** * Audio frame with a minimal header */ static int adbinary_audio_minimal(AVFormatContext *s, AVPacket *pkt, int size, struct NetVuAudioData *data) { AVIOContext *pb = s->pb; int dataSize = size - (4 + 2 + 2); int status; // Get the minimal audio header and copy into generic audio data structure memset(data, 0, sizeof(struct NetVuAudioData)); data->seconds = avio_rb32(pb); data->msecs = avio_rb16(pb); data->mode = avio_rb16(pb); if ( pb->error || (data->seconds == 0) ) { av_log(s, AV_LOG_ERROR, "%s: Reading header, errorcode %d\n", __func__, pb->error); return ADFFMPEG_AD_ERROR_MINIMAL_AUDIO_ADPCM_GET_BUFFER; } // Now get the main frame data into a new packet status = av_get_packet(pb, pkt, dataSize); if (status < 0) { av_log(s, AV_LOG_ERROR, "%s: av_get_packet (size %d) failed, status %d\n", __func__, data->sizeOfAudioData, status); return ADFFMPEG_AD_ERROR_MINIMAL_AUDIO_ADPCM_NEW_PACKET; } audiodata_network2host(pkt->data, pkt->data, dataSize); return status; }
static int r3d_read_red1(AVFormatContext *s) { AVStream *st = avformat_new_stream(s, NULL); R3DContext *r3d = s->priv_data; char filename[258]; int tmp; int av_unused tmp2; AVRational framerate; if (!st) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = AV_CODEC_ID_JPEG2000; tmp = avio_r8(s->pb); // major version tmp2 = avio_r8(s->pb); // minor version av_log(s, AV_LOG_TRACE, "version %d.%d\n", tmp, tmp2); tmp = avio_rb16(s->pb); // unknown av_log(s, AV_LOG_TRACE, "unknown1 %d\n", tmp); tmp = avio_rb32(s->pb); avpriv_set_pts_info(st, 32, 1, tmp); tmp = avio_rb32(s->pb); // filenum av_log(s, AV_LOG_TRACE, "filenum %d\n", tmp); avio_skip(s->pb, 32); // unknown st->codec->width = avio_rb32(s->pb); st->codec->height = avio_rb32(s->pb); tmp = avio_rb16(s->pb); // unknown av_log(s, AV_LOG_TRACE, "unknown2 %d\n", tmp); framerate.num = avio_rb16(s->pb); framerate.den = avio_rb16(s->pb); if (framerate.num > 0 && framerate.den > 0) { #if FF_API_R_FRAME_RATE st->r_frame_rate = #endif st->avg_frame_rate = framerate; } r3d->audio_channels = avio_r8(s->pb); // audio channels av_log(s, AV_LOG_TRACE, "audio channels %d\n", tmp); avio_read(s->pb, filename, 257); filename[sizeof(filename)-1] = 0; av_dict_set(&st->metadata, "filename", filename, 0); av_log(s, AV_LOG_TRACE, "filename %s\n", filename); av_log(s, AV_LOG_TRACE, "resolution %dx%d\n", st->codec->width, st->codec->height); av_log(s, AV_LOG_TRACE, "timescale %d\n", st->time_base.den); av_log(s, AV_LOG_TRACE, "frame rate %d/%d\n", framerate.num, framerate.den); return 0; }
static int rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr) { AVIOContext pb; int size; uint32_t tag; /** * Layout of the MLTI chunk: * 4: MLTI * 2: number of streams * Then for each stream ([number_of_streams] times): * 2: mdpr index * 2: number of mdpr chunks * Then for each mdpr chunk ([number_of_mdpr_chunks] times): * 4: size * [size]: data * we skip MDPR chunks until we reach the one of the stream * we're interested in, and forward that ([size]+[data]) to * the RM demuxer to parse the stream-specific header data. */ if (!rdt->mlti_data) return -1; ffio_init_context(&pb, rdt->mlti_data, rdt->mlti_data_size, 0, NULL, NULL, NULL, NULL); tag = avio_rl32(&pb); if (tag == MKTAG('M', 'L', 'T', 'I')) { int num, chunk_nr; /* read index of MDPR chunk numbers */ num = avio_rb16(&pb); if (rule_nr < 0 || rule_nr >= num) return -1; avio_skip(&pb, rule_nr * 2); chunk_nr = avio_rb16(&pb); avio_skip(&pb, (num - 1 - rule_nr) * 2); /* read MDPR chunks */ num = avio_rb16(&pb); if (chunk_nr >= num) return -1; while (chunk_nr--) avio_skip(&pb, avio_rb32(&pb)); size = avio_rb32(&pb); } else { size = rdt->mlti_data_size; avio_seek(&pb, 0, SEEK_SET); } if (ff_rm_read_mdpr_codecdata(rdt->rmctx, &pb, st, rdt->rmst[st->index], size) < 0) return -1; return 0; }
static int daud_packet(AVFormatContext *s, AVPacket *pkt) { AVIOContext *pb = s->pb; int ret, size; if (url_feof(pb)) return AVERROR(EIO); size = avio_rb16(pb); avio_rb16(pb); // unknown ret = av_get_packet(pb, pkt, size); pkt->stream_index = 0; return ret; }
static int r3d_read_redv(AVFormatContext *s, AVPacket *pkt, Atom *atom) { AVStream *st = s->streams[0]; int tmp; int av_unused tmp2; int64_t pos = avio_tell(s->pb); unsigned dts; int ret; dts = avio_rb32(s->pb); tmp = avio_rb32(s->pb); av_log(s, AV_LOG_TRACE, "frame num %d\n", tmp); tmp = avio_r8(s->pb); // major version tmp2 = avio_r8(s->pb); // minor version av_log(s, AV_LOG_TRACE, "version %d.%d\n", tmp, tmp2); tmp = avio_rb16(s->pb); // unknown av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp); if (tmp > 4) { tmp = avio_rb16(s->pb); // unknown av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp); tmp = avio_rb16(s->pb); // unknown av_log(s, AV_LOG_TRACE, "unknown %d\n", tmp); tmp = avio_rb32(s->pb); av_log(s, AV_LOG_TRACE, "width %d\n", tmp); tmp = avio_rb32(s->pb); av_log(s, AV_LOG_TRACE, "height %d\n", tmp); tmp = avio_rb32(s->pb); av_log(s, AV_LOG_TRACE, "metadata len %d\n", tmp); } tmp = atom->size - 8 - (avio_tell(s->pb) - pos); if (tmp < 0) return -1; ret = av_get_packet(s->pb, pkt, tmp); if (ret < 0) { av_log(s, AV_LOG_ERROR, "error reading video packet\n"); return -1; } pkt->stream_index = 0; pkt->dts = dts; if (st->avg_frame_rate.num) pkt->duration = (uint64_t)st->time_base.den* st->avg_frame_rate.den/st->avg_frame_rate.num; av_log(s, AV_LOG_TRACE, "pkt dts %"PRId64" duration %"PRId64"\n", pkt->dts, pkt->duration); return 0; }
static int read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size, pts, type, flags; int first_pkt = 0; int frame_complete = 0; while (!frame_complete) { type = avio_rb16(s->pb); // 257 or 258 size = avio_rb16(s->pb); flags = avio_rb16(s->pb); //some flags, 0x80 indicates end of frame avio_rb16(s->pb); //packet number pts = avio_rb32(s->pb); avio_rb32(s->pb); //6A 13 E3 88 frame_complete = flags & 0x80; size -= 12; if (size < 1) return -1; if (type == 258) { avio_skip(s->pb, size); frame_complete = 0; continue; } if (!first_pkt) { ret = av_get_packet(s->pb, pkt, size); if (ret < 0) return ret; first_pkt = 1; pkt->pts = pts; pkt->pos -= 16; } else { ret = av_append_packet(s->pb, pkt, size); if (ret < 0) { av_log(s, AV_LOG_ERROR, "failed to grow packet\n"); av_free_packet(pkt); return ret; } } if (ret < size) { av_log(s, AV_LOG_ERROR, "Truncated packet! Read %d of %d bytes\n", ret, size); pkt->flags |= AV_PKT_FLAG_CORRUPT; break; } } pkt->stream_index = 0; return 0; }
static int avr_read_header(AVFormatContext *s) { uint16_t chan, sign, bps; AVStream *st; st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; avio_skip(s->pb, 4); // magic avio_skip(s->pb, 8); // sample_name chan = avio_rb16(s->pb); if (!chan) { st->codecpar->channels = 1; } else if (chan == 0xFFFFu) { st->codecpar->channels = 2; } else { avpriv_request_sample(s, "chan %d", chan); return AVERROR_PATCHWELCOME; } st->codecpar->bits_per_coded_sample = bps = avio_rb16(s->pb); sign = avio_rb16(s->pb); avio_skip(s->pb, 2); // loop avio_skip(s->pb, 2); // midi avio_skip(s->pb, 1); // replay speed st->codecpar->sample_rate = avio_rb24(s->pb); avio_skip(s->pb, 4 * 3); avio_skip(s->pb, 2 * 3); avio_skip(s->pb, 20); avio_skip(s->pb, 64); st->codecpar->codec_id = ff_get_pcm_codec_id(bps, 0, 1, sign); if (st->codecpar->codec_id == AV_CODEC_ID_NONE) { avpriv_request_sample(s, "Bps %d and sign %d", bps, sign); return AVERROR_PATCHWELCOME; } st->codecpar->block_align = bps * st->codecpar->channels / 8; avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); return 0; }
static int get_num(AVIOContext *pb, int *len) { int n, n1; n = avio_rb16(pb); (*len)-=2; n &= 0x7FFF; if (n >= 0x4000) { return n - 0x4000; } else { n1 = avio_rb16(pb); (*len)-=2; return (n << 16) | n1; } }
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id) { int flags; if (es_id) *es_id = avio_rb16(pb); else avio_rb16(pb); flags = avio_r8(pb); if (flags & 0x80) //streamDependenceFlag avio_rb16(pb); if (flags & 0x40) { //URL_Flag int len = avio_r8(pb); avio_skip(pb, len); } if (flags & 0x20) //OCRstreamFlag avio_rb16(pb); }
static int sup_read_packet(AVFormatContext *s, AVPacket *pkt) { int64_t pts, dts, pos; int ret; pos = avio_tell(s->pb); if (avio_rb16(s->pb) != SUP_PGS_MAGIC) return avio_feof(s->pb) ? AVERROR_EOF : AVERROR_INVALIDDATA; pts = avio_rb32(s->pb); dts = avio_rb32(s->pb); if ((ret = av_get_packet(s->pb, pkt, 3)) < 0) return ret; pkt->stream_index = 0; pkt->flags |= AV_PKT_FLAG_KEY; pkt->pos = pos; pkt->pts = pts; // Many files have DTS set to 0 for all packets, so assume 0 means unset. pkt->dts = dts ? dts : AV_NOPTS_VALUE; if (pkt->size >= 3) { // The full packet size is stored as part of the packet. size_t len = AV_RB16(pkt->data + 1); if ((ret = av_append_packet(s->pb, pkt, len)) < 0) return ret; } return 0; }
static int sds_read_packet(AVFormatContext *ctx, AVPacket *pkt) { SDSContext *s = ctx->priv_data; AVIOContext *pb = ctx->pb; int64_t pos; int ret; if (avio_feof(pb)) return AVERROR_EOF; pos = avio_tell(pb); if (avio_rb16(pb) != 0xF07E) return AVERROR_INVALIDDATA; avio_skip(pb, 3); ret = av_new_packet(pkt, s->size); if (ret < 0) return ret; ret = avio_read(pb, s->data, 120); s->read_block(s->data, (uint32_t *)pkt->data); avio_skip(pb, 1); // checksum if (avio_r8(pb) != 0xF7) return AVERROR_INVALIDDATA; pkt->flags &= ~AV_PKT_FLAG_CORRUPT; pkt->stream_index = 0; pkt->pos = pos; return ret; }
static int cdata_read_header(AVFormatContext *s, AVFormatParameters *ap) { CdataDemuxContext *cdata = s->priv_data; AVIOContext *pb = s->pb; unsigned int sample_rate, header; AVStream *st; int64_t channel_layout = 0; header = avio_rb16(pb); switch (header) { case 0x0400: cdata->channels = 1; break; case 0x0404: cdata->channels = 2; break; case 0x040C: cdata->channels = 4; channel_layout = AV_CH_LAYOUT_QUAD; break; case 0x0414: cdata->channels = 6; channel_layout = AV_CH_LAYOUT_5POINT1_BACK; break; default: av_log(s, AV_LOG_INFO, "unknown header 0x%04x\n", header); return -1; }; sample_rate = avio_rb16(pb); avio_skip(pb, (avio_r8(pb) & 0x20) ? 15 : 11); st = av_new_stream(s, 0); if (!st) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = 0; /* no fourcc */ st->codec->codec_id = CODEC_ID_ADPCM_EA_XAS; st->codec->channels = cdata->channels; st->codec->channel_layout = channel_layout; st->codec->sample_rate = sample_rate; st->codec->sample_fmt = AV_SAMPLE_FMT_S16; av_set_pts_info(st, 64, 1, sample_rate); cdata->audio_pts = 0; return 0; }
static av_always_inline unsigned int read16(AVFormatContext *s) { BRSTMDemuxContext *b = s->priv_data; if (b->little_endian) return avio_rl16(s->pb); else return avio_rb16(s->pb); }
static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const char *key) { char *q, dst[512]; const char *val = NULL; int len, dstlen = sizeof(dst) - 1; unsigned genre; unsigned int (*get)(AVIOContext*) = avio_rb16; dst[0] = 0; if (taglen < 1) return; taglen--; /* account for encoding type byte */ switch (avio_r8(pb)) { /* encoding type */ case ID3v2_ENCODING_ISO8859: q = dst; while (taglen-- && q - dst < dstlen - 7) { uint8_t tmp; PUT_UTF8(avio_r8(pb), tmp, *q++ = tmp;) } *q = 0; break; case ID3v2_ENCODING_UTF16BOM: taglen -= 2; switch (avio_rb16(pb)) { case 0xfffe: get = avio_rl16; case 0xfeff: break; default: av_log(s, AV_LOG_ERROR, "Incorrect BOM value in tag %s.\n", key); return; } // fall-through case ID3v2_ENCODING_UTF16BE: q = dst; while (taglen > 1 && q - dst < dstlen - 7) { uint32_t ch; uint8_t tmp; GET_UTF16(ch, ((taglen -= 2) >= 0 ? get(pb) : 0), break;) PUT_UTF8(ch, tmp, *q++ = tmp;) } *q = 0; break; case ID3v2_ENCODING_UTF8: len = FFMIN(taglen, dstlen); avio_read(pb, dst, len); dst[len] = 0; break; default: av_log(s, AV_LOG_WARNING, "Unknown encoding in tag %s.\n", key); }
/** * Try to find Xing/Info/VBRI tags and compute duration from info therein */ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base) { uint32_t v, spf; unsigned frames = 0; /* Total number of frames in file */ unsigned size = 0; /* Total number of bytes in the stream */ const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}}; MPADecodeHeader c; int vbrtag_size = 0; v = avio_rb32(s->pb); if(ff_mpa_check_header(v) < 0) return -1; if (avpriv_mpegaudio_decode_header(&c, v) == 0) vbrtag_size = c.frame_size; if(c.layer != 3) return -1; /* Check for Xing / Info tag */ avio_skip(s->pb, xing_offtbl[c.lsf == 1][c.nb_channels == 1]); v = avio_rb32(s->pb); if(v == MKBETAG('X', 'i', 'n', 'g') || v == MKBETAG('I', 'n', 'f', 'o')) { v = avio_rb32(s->pb); if(v & 0x1) frames = avio_rb32(s->pb); if(v & 0x2) size = avio_rb32(s->pb); } /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */ avio_seek(s->pb, base + 4 + 32, SEEK_SET); v = avio_rb32(s->pb); if(v == MKBETAG('V', 'B', 'R', 'I')) { /* Check tag version */ if(avio_rb16(s->pb) == 1) { /* skip delay and quality */ avio_skip(s->pb, 4); size = avio_rb32(s->pb); frames = avio_rb32(s->pb); } } if(!frames && !size) return -1; /* Skip the vbr tag frame */ avio_seek(s->pb, base + vbrtag_size, SEEK_SET); spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */ if(frames) st->duration = av_rescale_q(frames, (AVRational){spf, c.sample_rate}, st->time_base); if(size && frames) st->codec->bit_rate = av_rescale(size, 8 * c.sample_rate, frames * (int64_t)spf); return 0; }
static int flv_data_packet(AVFormatContext *s, AVPacket *pkt, int64_t dts, int64_t next) { int ret = AVERROR_INVALIDDATA, i; AVIOContext *pb = s->pb; AVStream *st = NULL; AMFDataType type; char buf[20]; int length; type = avio_r8(pb); if (type == AMF_DATA_TYPE_MIXEDARRAY) avio_seek(pb, 4, SEEK_CUR); else if (type != AMF_DATA_TYPE_OBJECT) goto out; amf_get_string(pb, buf, sizeof(buf)); if (strcmp(buf, "type") || avio_r8(pb) != AMF_DATA_TYPE_STRING) goto out; amf_get_string(pb, buf, sizeof(buf)); //FIXME parse it as codec_id amf_get_string(pb, buf, sizeof(buf)); if (strcmp(buf, "text") || avio_r8(pb) != AMF_DATA_TYPE_STRING) goto out; length = avio_rb16(pb); ret = av_get_packet(s->pb, pkt, length); if (ret < 0) { ret = AVERROR(EIO); goto out; } for (i = 0; i < s->nb_streams; i++) { st = s->streams[i]; if (st->id == 2) break; } if (i == s->nb_streams) { st = create_stream(s, 2, AVMEDIA_TYPE_DATA); if (!st) goto out; st->codec->codec_id = CODEC_ID_TEXT; } pkt->dts = dts; pkt->pts = dts; pkt->size = ret; pkt->stream_index = st->index; pkt->flags |= AV_PKT_FLAG_KEY; avio_seek(s->pb, next + 4, SEEK_SET); out: return ret; }
static int rso_read_header(AVFormatContext *s) { AVIOContext *pb = s->pb; int id, rate, bps; unsigned int size; enum AVCodecID codec; AVStream *st; id = avio_rb16(pb); size = avio_rb16(pb); rate = avio_rb16(pb); avio_rb16(pb); /* play mode ? (0x0000 = don't loop) */ codec = ff_codec_get_id(ff_codec_rso_tags, id); if (codec == AV_CODEC_ID_ADPCM_IMA_WAV) { av_log(s, AV_LOG_ERROR, "ADPCM in RSO not implemented\n"); return AVERROR_PATCHWELCOME; } bps = av_get_bits_per_sample(codec); if (!bps) { av_log_ask_for_sample(s, "could not determine bits per sample\n"); return AVERROR_INVALIDDATA; } /* now we are ready: build format streams */ st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); st->duration = (size * 8) / bps; st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = id; st->codec->codec_id = codec; st->codec->channels = 1; st->codec->channel_layout = AV_CH_LAYOUT_MONO; st->codec->sample_rate = rate; avpriv_set_pts_info(st, 64, 1, rate); return 0; }
static void rm_read_metadata(AVFormatContext *s, AVIOContext *pb, int wide) { char buf[1024]; int i; for (i=0; i<FF_ARRAY_ELEMS(ff_rm_metadata); i++) { int len = wide ? avio_rb16(pb) : avio_r8(pb); get_strl(pb, buf, sizeof(buf), len); av_dict_set(&s->metadata, ff_rm_metadata[i], buf, 0); } }
static int adx_read_header(AVFormatContext *s) { ADXDemuxerContext *c = s->priv_data; AVCodecParameters *par; AVStream *st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); par = s->streams[0]->codecpar; if (avio_rb16(s->pb) != 0x8000) return AVERROR_INVALIDDATA; c->header_size = avio_rb16(s->pb) + 4; avio_seek(s->pb, -4, SEEK_CUR); if (ff_get_extradata(s, par, s->pb, c->header_size) < 0) return AVERROR(ENOMEM); if (par->extradata_size < 12) { av_log(s, AV_LOG_ERROR, "Invalid extradata size.\n"); return AVERROR_INVALIDDATA; } par->channels = AV_RB8 (par->extradata + 7); par->sample_rate = AV_RB32(par->extradata + 8); if (par->channels <= 0) { av_log(s, AV_LOG_ERROR, "invalid number of channels %d\n", par->channels); return AVERROR_INVALIDDATA; } if (par->sample_rate <= 0) { av_log(s, AV_LOG_ERROR, "Invalid sample rate %d\n", par->sample_rate); return AVERROR_INVALIDDATA; } par->codec_type = AVMEDIA_TYPE_AUDIO; par->codec_id = s->iformat->raw_codec_id; par->bit_rate = par->sample_rate * par->channels * BLOCK_SIZE * 8LL / BLOCK_SAMPLES; avpriv_set_pts_info(st, 64, BLOCK_SAMPLES, par->sample_rate); return 0; }
static int lmlm4_read_packet(AVFormatContext *s, AVPacket *pkt) { AVIOContext *pb = s->pb; int ret; unsigned int frame_type, packet_size, padding, frame_size; avio_rb16(pb); /* channel number */ frame_type = avio_rb16(pb); packet_size = avio_rb32(pb); padding = -packet_size & 511; frame_size = packet_size - 8; if (frame_type > LMLM4_MPEG1L2 || frame_type == LMLM4_INVALID) { av_log(s, AV_LOG_ERROR, "invalid or unsupported frame_type\n"); return AVERROR(EIO); } if (packet_size > LMLM4_MAX_PACKET_SIZE) { av_log(s, AV_LOG_ERROR, "packet size exceeds maximum\n"); return AVERROR(EIO); } if ((ret = av_get_packet(pb, pkt, frame_size)) <= 0) return AVERROR(EIO); avio_skip(pb, padding); switch (frame_type) { case LMLM4_I_FRAME: pkt->flags = AV_PKT_FLAG_KEY; case LMLM4_P_FRAME: case LMLM4_B_FRAME: pkt->stream_index = 0; break; case LMLM4_MPEG1L2: pkt->stream_index = 1; break; } return ret; }
/** this function assumes that the demuxer has already seeked to the start * of the INDX chunk, and will bail out if not. */ static int rm_read_index(AVFormatContext *s) { AVIOContext *pb = s->pb; unsigned int size, n_pkts, str_id, next_off, n, pos, pts; AVStream *st; do { if (avio_rl32(pb) != MKTAG('I','N','D','X')) return -1; size = avio_rb32(pb); if (size < 20) return -1; avio_skip(pb, 2); n_pkts = avio_rb32(pb); str_id = avio_rb16(pb); next_off = avio_rb32(pb); for (n = 0; n < s->nb_streams; n++) if (s->streams[n]->id == str_id) { st = s->streams[n]; break; } if (n == s->nb_streams) { av_log(s, AV_LOG_ERROR, "Invalid stream index %d for index at pos %"PRId64"\n", str_id, avio_tell(pb)); goto skip; } else if ((avio_size(pb) - avio_tell(pb)) / 14 < n_pkts) { av_log(s, AV_LOG_ERROR, "Nr. of packets in packet index for stream index %d " "exceeds filesize (%"PRId64" at %"PRId64" = %"PRId64")\n", str_id, avio_size(pb), avio_tell(pb), (avio_size(pb) - avio_tell(pb)) / 14); goto skip; } for (n = 0; n < n_pkts; n++) { avio_skip(pb, 2); pts = avio_rb32(pb); pos = avio_rb32(pb); avio_skip(pb, 4); /* packet no. */ av_add_index_entry(st, pos, pts, 0, 0, AVINDEX_KEYFRAME); } skip: if (next_off && avio_tell(pb) < next_off && avio_seek(pb, next_off, SEEK_SET) < 0) { av_log(s, AV_LOG_ERROR, "Non-linear index detected, not supported\n"); return -1; } } while (next_off); return 0; }
static int read_header(AVFormatContext *s, AVFormatParameters *ap) { FilmstripDemuxContext *film = s->priv_data; AVIOContext *pb = s->pb; AVStream *st; if (!s->pb->seekable) return AVERROR(EIO); avio_seek(pb, avio_size(pb) - 36, SEEK_SET); if (avio_rb32(pb) != RAND_TAG) { av_log(s, AV_LOG_ERROR, "magic number not found"); return AVERROR_INVALIDDATA; } st = av_new_stream(s, 0); if (!st) return AVERROR(ENOMEM); st->nb_frames = avio_rb32(pb); if (avio_rb16(pb) != 0) { av_log_ask_for_sample(s, "unsupported packing method\n"); return AVERROR_INVALIDDATA; } avio_skip(pb, 2); st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = CODEC_ID_RAWVIDEO; st->codec->pix_fmt = PIX_FMT_RGBA; st->codec->codec_tag = 0; /* no fourcc */ st->codec->width = avio_rb16(pb); st->codec->height = avio_rb16(pb); film->leading = avio_rb16(pb); av_set_pts_info(st, 64, 1, avio_rb16(pb)); avio_seek(pb, 0, SEEK_SET); return 0; }
static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) { int length = avio_rb16(ioc); if(length >= buffsize) { avio_skip(ioc, length); return -1; } avio_read(ioc, buffer, length); buffer[length] = '\0'; return length; }
static int ast_read_header(AVFormatContext *s) { int depth; AVStream *st; st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); avio_skip(s->pb, 8); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = ff_codec_get_id(ff_codec_ast_tags, avio_rb16(s->pb)); depth = avio_rb16(s->pb); if (depth != 16) { avpriv_request_sample(s, "depth %d", depth); return AVERROR_INVALIDDATA; } st->codec->channels = avio_rb16(s->pb); if (!st->codec->channels) return AVERROR_INVALIDDATA; if (st->codec->channels == 2) st->codec->channel_layout = AV_CH_LAYOUT_STEREO; else if (st->codec->channels == 4) st->codec->channel_layout = AV_CH_LAYOUT_4POINT0; avio_skip(s->pb, 2); st->codec->sample_rate = avio_rb32(s->pb); if (st->codec->sample_rate <= 0) return AVERROR_INVALIDDATA; st->start_time = 0; st->duration = avio_rb32(s->pb); avio_skip(s->pb, 40); avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); return 0; }
/** * Decode characters to UTF-8 according to encoding type. The decoded buffer is * always null terminated. Stop reading when either *maxread bytes are read from * pb or U+0000 character is found. * * @param dst Pointer where the address of the buffer with the decoded bytes is * stored. Buffer must be freed by caller. * @param maxread Pointer to maximum number of characters to read from the * AVIOContext. After execution the value is decremented by the number of bytes * actually read. * @returns 0 if no error occurred, dst is uninitialized on error */ static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding, uint8_t **dst, int *maxread) { int ret; uint8_t tmp; uint32_t ch = 1; int left = *maxread; unsigned int (*get)(AVIOContext*) = avio_rb16; AVIOContext *dynbuf; if ((ret = avio_open_dyn_buf(&dynbuf)) < 0) { av_log(s, AV_LOG_ERROR, "Error opening memory stream\n"); return ret; } switch (encoding) { case ID3v2_ENCODING_ISO8859: while (left && ch) { ch = avio_r8(pb); PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);) left--; } break; case ID3v2_ENCODING_UTF16BOM: if ((left -= 2) < 0) { av_log(s, AV_LOG_ERROR, "Cannot read BOM value, input too short\n"); avio_close_dyn_buf(dynbuf, dst); av_freep(dst); return AVERROR_INVALIDDATA; } switch (avio_rb16(pb)) { case 0xfffe: get = avio_rl16; case 0xfeff: break; default: av_log(s, AV_LOG_ERROR, "Incorrect BOM value\n"); avio_close_dyn_buf(dynbuf, dst); av_freep(dst); *maxread = left; return AVERROR_INVALIDDATA; } // fall-through case ID3v2_ENCODING_UTF16BE: while ((left > 1) && ch) { GET_UTF16(ch, ((left -= 2) >= 0 ? get(pb) : 0), break;) PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);) }