| 37 | } |
| 38 | |
| 39 | static int hcom_read_header(AVFormatContext *s) |
| 40 | { |
| 41 | AVStream *st; |
| 42 | av_unused unsigned data_size, rsrc_size, huffcount; |
| 43 | unsigned compresstype, divisor; |
| 44 | unsigned dict_entries; |
| 45 | int ret; |
| 46 | |
| 47 | avio_skip(s->pb, 83); |
| 48 | data_size = avio_rb32(s->pb); |
| 49 | rsrc_size = avio_rb32(s->pb); |
| 50 | avio_skip(s->pb, 128-91+4); |
| 51 | huffcount = avio_rb32(s->pb); |
| 52 | avio_skip(s->pb, 4); |
| 53 | compresstype = avio_rb32(s->pb); |
| 54 | if (compresstype > 1) |
| 55 | return AVERROR_INVALIDDATA; |
| 56 | divisor = avio_rb32(s->pb); |
| 57 | if (divisor == 0 || divisor > 4) |
| 58 | return AVERROR_INVALIDDATA; |
| 59 | dict_entries = avio_rb16(s->pb); |
| 60 | |
| 61 | st = avformat_new_stream(s, NULL); |
| 62 | if (!st) |
| 63 | return AVERROR(ENOMEM); |
| 64 | |
| 65 | st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; |
| 66 | st->codecpar->ch_layout.nb_channels = 1; |
| 67 | st->codecpar->sample_rate = 22050 / divisor; |
| 68 | st->codecpar->codec_id = AV_CODEC_ID_HCOM; |
| 69 | st->codecpar->bits_per_coded_sample = 8; |
| 70 | st->codecpar->block_align = 4; |
| 71 | |
| 72 | ret = ff_alloc_extradata(st->codecpar, dict_entries * 4 + 7); |
| 73 | if (ret < 0) |
| 74 | return ret; |
| 75 | AV_WB16(st->codecpar->extradata, dict_entries); |
| 76 | AV_WB32(st->codecpar->extradata + 2, compresstype); |
| 77 | ret = ffio_read_size(s->pb, st->codecpar->extradata + 6, dict_entries * 4); |
| 78 | if (ret < 0) |
| 79 | return ret; |
| 80 | avio_skip(s->pb, 1); |
| 81 | st->codecpar->extradata[dict_entries * 4 + 6] = avio_r8(s->pb); |
| 82 | |
| 83 | avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); |
| 84 | |
| 85 | return 0; |
| 86 | } |
| 87 | |
| 88 | const FFInputFormat ff_hcom_demuxer = { |
| 89 | .p.name = "hcom", |
nothing calls this directly
no test coverage detected