夏天什么花会开| 手机充电发烫是什么原因| 什么是阿尔茨海默症| 甲减对胎儿有什么影响| 值机是什么意思| 植物神经功能紊乱吃什么药| 骨皮质扭曲是什么意思啊| 5月22日什么星座| 输卵管不通有什么症状| 为什么不敢挖雍正陵墓| 跑男什么时候播出| 脚指甲盖凹凸不平是什么原因| mario是什么意思| 十年粤语版叫什么名字| 不服是什么意思| h2o是什么| 倒卖是什么意思| 什么叫打卡| 源源不断是什么意思| 头发油腻是什么原因| 子宫和宫颈有什么区别| 脚肿什么原因| 巨蟹男喜欢什么类型的女生| 艾滋病潜伏期有什么症状| 性生活是什么意思| gabor是什么牌子| 花菜炒什么好吃| 木行念什么| 窍门是什么意思| 咆哮是什么意思| 醪糟是什么| 尿不净是什么原因| 21三体临界风险是什么意思| 头孢主要治什么病| focus什么意思| 梦到下雪是什么意思| 电器火灾用什么灭火器| 什么是意淫| 什么是小男人| 蛤蟆吃什么| 阑尾炎输液输什么药| 做健身教练有什么要求| mra是什么检查| 春天有什么动物| 经期不能吃什么水果| 补肝血吃什么药| 肖想是什么意思| 泡腾片是干什么用的| 超敏c反应蛋白正常说明什么| 检查肠胃做什么检查| 怀孕吃什么水果比较好| 什么样的太阳| 吃什么消肿| 产妇刚生完孩子适合吃什么| 喉咙疼痛一咽口水就疼吃什么药| 什么的钩住| 手机充电口叫什么| 前列腺肥大是什么原因引起| 水清则无鱼什么意思| 血小板过低有什么危害| 宝宝为什么老是吐奶| 细小是什么病| 正负得什么| 女人梦到蝎子什么征兆| 827是什么意思| 躺平是什么意思| 尿液分析是检查什么| 肺纤维化有什么症状| 日本为什么经常地震| 水落石出是什么生肖| 觅食是什么意思| 拔罐拔出水是什么原因| 喝酒后胃不舒服吃什么药| 诸事顺遂是什么意思| 1130是什么星座| 808什么意思| 农历八月初五是什么星座| 尿比重是什么意思| 蓝字五行属什么| 窦骁父母是干什么的| 男人梦见血是什么预兆| 金丝雀是什么意思| 溘然是什么意思| Cr是什么意思医学| 追溯码是什么意思| 人为什么会得肿瘤| 口吃是什么意思| 肾结石吃什么水果好| gaba是什么| 无性婚姻会有什么好处| 脖子上长癣是什么原因| 出冷汗是什么原因| 四月七号是什么星座| 12月11号是什么星座| 牙齿脱矿是什么原因| 脂肪肝吃什么食物好| 农历正月初一是什么节日| 2楼五行属什么| 草酸是干什么用的| 什么是癫痫| 清热利湿是什么意思| 淋巴肉是什么| 胃发胀是什么原因| 君山银针属于什么茶| 柯萨奇病毒是什么病| 妇科活检是什么意思| 无味是什么意思| 女人内火旺喝什么降火| 农历3月是什么星座| 为什么会有肥胖纹| 世界上最长的河流是什么| 郑板桥爱画什么| 雨污分流什么意思| 滑液是由什么分泌的| 三刀六洞什么意思| 兔和什么生肖最配| zeesea是什么牌子| 反流性食管炎挂什么科| tide什么意思| 你说什么| 5月8日是什么星座| 烫伤用什么药膏| 寒冷性荨麻疹是什么原因引起的| 螨虫用什么药膏| 柏拉图爱情是什么意思| 白细胞高吃什么降得快| 洋桔梗的花语是什么| 左侧头皮发麻是什么原因| 七十岁老人装什么牙合适| 机能鞋是什么意思| 为什么没人穿卡帕| 卵泡破裂是什么意思| 大校是什么级别| 做梦梦到小孩子是什么意思| 厚积薄发是什么意思啊| 青稞面是什么| 宝宝喝什么奶粉好| 排卵期什么意思| 上岸了是什么意思| 02年的马是什么命| 刚怀孕吃什么水果对胎儿好| 1959属什么生肖| i.t品牌什么档次| 尿道下裂是什么意思| 结梁子什么意思| 小鸭子吃什么| 皮肤长癣是什么原因| pp材质是什么材质| 疝外科是治什么病的| 给男朋友买什么礼物比较好| 夫妻宫是什么意思| 出汗太多吃什么药好| 肾出问题了有什么症状| 免疫系统由什么组成| soda是什么意思| 毛主席属什么生肖| 阴道真菌感染用什么药| rads是什么意思| 吃什么容易长肉| 乙型肝炎e抗体阳性是什么意思| 上技校学什么专业好| 血糖高注意什么| 什么样的人容易猝死| 笔记本电脑什么品牌好| 什么 姿势 最深| 白羊座上升星座是什么| 祸祸是什么意思| 为什么越吃越饿| 西红柿吃多了有什么坏处| 眉心跳动代表什么预兆| 做梦梦见大火是什么意思| 香兰素是什么东西| 95年属什么的| 不可抗力是什么意思| 睡眠浅是什么原因| 手麻抽筋是什么原因引起的| 长期缺铁性贫血会导致什么后果| 全脂牛奶是什么意思| mdr是什么意思| 坐月子可以吃什么零食| 经常便秘吃什么药好| 膀胱炎有什么症状| 益生元和益生菌有什么区别| 梦见摘辣椒是什么意思| 虎的贵人是什么生肖| 云想衣裳花想容是什么意思| 精尽人亡什么意思| 包煎是什么意思| 容易长口腔溃疡是什么原因| 什么的被子| 垂线是什么| 小孩头疼是什么原因| 家里为什么有蜈蚣| 6.19什么星座| 份子钱是什么意思| 维c吃多了有什么副作用| 文曲星什么意思| 猫咪打呼噜代表什么| im什么意思| 热火朝天是什么意思| 面瘫是什么引起的| 剪不断理还乱什么意思| 七月初七是什么星座| 十月一日什么星座| 红豆薏仁水有什么功效| 尿常规白细胞高是什么原因| 瓤是什么意思| 马代表什么数字| 梦见种花生是什么意思| 舌头不舒服是什么原因引起的| 皮卡丘什么意思| 食道好像有东西堵着是什么原因| 老人手抖是什么病的预兆| 画画可以画什么| 妖是什么意思| 腰酸是什么原因引起的| 社保局是干什么的| 命理是什么意思| 什么是社恐| 麒麟什么意思| 大象吃什么食物| 国家副主席是什么级别| prr是什么意思| 氧化剂是什么| 简称是什么意思| 活在当下什么意思| 后背疼去医院挂什么科| 大腿肌肉疼是什么原因| 肾囊肿是什么| 阿胶补血口服液适合什么人喝| 总是拉肚子是什么原因| 新百伦属于什么档次| 口蘑是什么| 什么蛇可以吃| 女人大姨妈来了吃什么最好| 回族信仰什么教| 什么叫间质瘤| 胆囊炎可以吃什么水果| 异物进入气管什么症状| 睾丸扭转是什么意思| 夜不能寐是什么意思| 腰的左侧疼是什么原因| 血液发黑是什么原因| 龟龄集适合什么人吃| 蛇酒不是三十九开什么| 郭敬明为什么叫小四| 孔夫子搬家的歇后语是什么| 灯五行属什么| 拉肚子吃什么消炎药好| 头晕头重昏昏沉沉是什么原因| 年下恋是什么意思| 秋葵吃多了有什么坏处| 13数字代表什么意思| 维酶素片搭配什么药治萎缩性胃炎| 什么不一| 尿道感染是什么原因引起| 边缘性脐带入口是什么意思| 臣附议是什么意思| 脸痒痒用什么方法可以缓解| 活好的女人有什么表现| 登革热是什么病| 一枚什么| 结售汇是什么意思| 切除阑尾对身体有什么影响| 百度


Directory: ../../../ffmpeg/
File: src/libavformat/psxstr.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 116 142 81.7%
Functions: 4 4 100.0%
Branches: 51 77 66.2%

Line Branch Exec Source
1 /*
2 * Sony Playstation (PSX) STR File Demuxer
3 * Copyright (c) 2003 The FFmpeg project
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * PSX STR file demuxer
25 * by Mike Melanson (melanson@pcisys.net)
26 * This module handles streams that have been ripped from Sony Playstation
27 * CD games. This demuxer can handle either raw STR files (which are just
28 * concatenations of raw compact disc sectors) or STR files with 0x2C-byte
29 * RIFF headers, followed by CD sectors.
30 */
31
32 #include "libavutil/channel_layout.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/intreadwrite.h"
35 #include "avformat.h"
36 #include "demux.h"
37 #include "internal.h"
38
39 #define RIFF_TAG MKTAG('R', 'I', 'F', 'F')
40 #define CDXA_TAG MKTAG('C', 'D', 'X', 'A')
41
42 #define RAW_CD_SECTOR_SIZE 2352
43 #define RAW_CD_SECTOR_DATA_SIZE 2304
44 #define VIDEO_DATA_CHUNK_SIZE 0x7E0
45 #define VIDEO_DATA_HEADER_SIZE 0x38
46 #define RIFF_HEADER_SIZE 0x2C
47
48 #define CDXA_TYPE_MASK 0x0E
49 #define CDXA_TYPE_DATA 0x08
50 #define CDXA_TYPE_AUDIO 0x04
51 #define CDXA_TYPE_VIDEO 0x02
52 #define CDXA_TYPE_EMPTY 0x00
53
54 #define STR_MAGIC (0x80010160)
55
56 typedef struct StrChannel {
57 /* video parameters */
58 int video_stream_index;
59 AVPacket tmp_pkt;
60
61 /* audio parameters */
62 int audio_stream_index;
63 } StrChannel;
64
65 typedef struct StrDemuxContext {
66
67 /* a STR file can contain up to 32 channels of data */
68 StrChannel channels[32];
69 } StrDemuxContext;
70
71 static const uint8_t sync_header[12] = {0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
72
73 7241 static int str_probe(const AVProbeData *p)
74 {
75 7241 const uint8_t *sector= p->buf;
76 7241 const uint8_t *end= sector + p->buf_size;
77 7241 int aud=0, vid=0;
78
79
2/2
✓ Branch 0 taken 4019 times.
✓ Branch 1 taken 3222 times.
7241 if (p->buf_size < RAW_CD_SECTOR_SIZE)
80 4019 return 0;
81
82
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3216 times.
3222 if ((AV_RL32(&p->buf[0]) == RIFF_TAG) &&
83
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 (AV_RL32(&p->buf[8]) == CDXA_TAG)) {
84
85 /* RIFF header seen; skip 0x2C bytes */
86 6 sector += RIFF_HEADER_SIZE;
87 }
88
89
2/2
✓ Branch 0 taken 3243 times.
✓ Branch 1 taken 9 times.
3252 while (end - sector >= RAW_CD_SECTOR_SIZE) {
90 /* look for CD sync header (00, 0xFF x 10, 00) */
91
2/2
✓ Branch 0 taken 3213 times.
✓ Branch 1 taken 30 times.
3243 if (memcmp(sector,sync_header,sizeof(sync_header)))
92 3213 return 0;
93
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if (sector[0x11] >= 32)
95 return 0;
96
97
1/3
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
30 switch (sector[0x12] & CDXA_TYPE_MASK) {
98 30 case CDXA_TYPE_DATA:
99 case CDXA_TYPE_VIDEO: {
100 30 int current_sector = AV_RL16(&sector[0x1C]);
101 30 int sector_count = AV_RL16(&sector[0x1E]);
102 30 int frame_size = AV_RL32(&sector[0x24]);
103
104
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 if(!( frame_size>=0
105
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 && current_sector < sector_count
106
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
107 return 0;
108 }
109 30 vid++;
110
111 }
112 30 break;
113 case CDXA_TYPE_AUDIO:
114 if(sector[0x13]&0x2A)
115 return 0;
116 aud++;
117 break;
118 default:
119 if(sector[0x12] & CDXA_TYPE_MASK)
120 return 0;
121 }
122 30 sector += RAW_CD_SECTOR_SIZE;
123 }
124 /* MPEG files (like those ripped from VCDs) can also look like this;
125 * only return half certainty */
126
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 6 times.
9 if(vid+aud > 3) return AVPROBE_SCORE_EXTENSION;
127
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 else if(vid+aud) return 1;
128 else return 0;
129 }
130
131 3 static int str_read_header(AVFormatContext *s)
132 {
133 3 AVIOContext *pb = s->pb;
134 3 StrDemuxContext *str = s->priv_data;
135 unsigned char sector[RAW_CD_SECTOR_SIZE];
136 int start;
137 int i;
138
139 /* skip over any RIFF header */
140
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (avio_read(pb, sector, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE)
141 return AVERROR(EIO);
142
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if (AV_RL32(&sector[0]) == RIFF_TAG)
143 2 start = RIFF_HEADER_SIZE;
144 else
145 1 start = 0;
146
147 3 avio_seek(pb, start, SEEK_SET);
148
149
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 3 times.
99 for(i=0; i<32; i++){
150 96 str->channels[i].video_stream_index=
151 96 str->channels[i].audio_stream_index= -1;
152 }
153
154 3 s->ctx_flags |= AVFMTCTX_NOHEADER;
155
156 3 return 0;
157 }
158
159 397 static int str_read_packet(AVFormatContext *s,
160 AVPacket *ret_pkt)
161 {
162 397 AVIOContext *pb = s->pb;
163 397 StrDemuxContext *str = s->priv_data;
164 unsigned char sector[RAW_CD_SECTOR_SIZE];
165 int channel, ret;
166 AVPacket *pkt;
167 AVStream *st;
168
169 1093 while (1) {
170 1490 int read = avio_read(pb, sector, RAW_CD_SECTOR_SIZE);
171
172
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1488 times.
1490 if (read == AVERROR_EOF)
173 2 return AVERROR_EOF;
174
175
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1485 times.
1488 if (read != RAW_CD_SECTOR_SIZE)
176 3 return AVERROR(EIO);
177
178 1485 channel = sector[0x11];
179
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1485 times.
1485 if (channel >= 32)
180 return AVERROR_INVALIDDATA;
181
182
2/4
✓ Branch 0 taken 1300 times.
✓ Branch 1 taken 185 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1485 switch (sector[0x12] & CDXA_TYPE_MASK) {
183
184 1300 case CDXA_TYPE_DATA:
185 case CDXA_TYPE_VIDEO:
186 {
187
188 1300 int current_sector = AV_RL16(&sector[0x1C]);
189 1300 int sector_count = AV_RL16(&sector[0x1E]);
190 1300 int frame_size = AV_RL32(&sector[0x24]);
191
192
1/2
✓ Branch 0 taken 1300 times.
✗ Branch 1 not taken.
1300 if(!( frame_size>=0
193
1/2
✓ Branch 0 taken 1300 times.
✗ Branch 1 not taken.
1300 && current_sector < sector_count
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1300 times.
1300 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
195 av_log(s, AV_LOG_ERROR, "Invalid parameters %d %d %d\n", current_sector, sector_count, frame_size);
196 break;
197 }
198
199
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1297 times.
1300 if(str->channels[channel].video_stream_index < 0){
200 /* allocate a new AVStream */
201 3 st = avformat_new_stream(s, NULL);
202
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!st)
203 return AVERROR(ENOMEM);
204 3 avpriv_set_pts_info(st, 64, 1, 15);
205
206 3 str->channels[channel].video_stream_index = st->index;
207
208 3 st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
209 3 st->codecpar->codec_id = AV_CODEC_ID_MDEC;
210 3 st->codecpar->codec_tag = 0; /* no fourcc */
211 3 st->codecpar->width = AV_RL16(&sector[0x28]);
212 3 st->codecpar->height = AV_RL16(&sector[0x2A]);
213 }
214
215 /* if this is the first sector of the frame, allocate a pkt */
216 1300 pkt = &str->channels[channel].tmp_pkt;
217
218
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 1090 times.
1300 if(pkt->size != sector_count*VIDEO_DATA_CHUNK_SIZE){
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
210 if(pkt->data)
220 av_log(s, AV_LOG_ERROR, "mismatching sector_count\n");
221 210 av_packet_unref(pkt);
222 210 ret = av_new_packet(pkt, sector_count * VIDEO_DATA_CHUNK_SIZE);
223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
210 if (ret < 0)
224 return ret;
225 210 memset(pkt->data, 0, sector_count*VIDEO_DATA_CHUNK_SIZE);
226
227 210 pkt->pos= avio_tell(pb) - RAW_CD_SECTOR_SIZE;
228 210 pkt->stream_index =
229 210 str->channels[channel].video_stream_index;
230 }
231
232 1300 memcpy(pkt->data + current_sector*VIDEO_DATA_CHUNK_SIZE,
233 sector + VIDEO_DATA_HEADER_SIZE,
234 VIDEO_DATA_CHUNK_SIZE);
235
236
2/2
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 1093 times.
1300 if (current_sector == sector_count-1) {
237 207 pkt->size= frame_size;
238 207 *ret_pkt = *pkt;
239 207 pkt->data= NULL;
240 207 pkt->size= -1;
241 207 pkt->buf = NULL;
242 207 return 0;
243 }
244
245 }
246 1093 break;
247
248 185 case CDXA_TYPE_AUDIO:
249
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 182 times.
185 if(str->channels[channel].audio_stream_index < 0){
250 3 int fmt = sector[0x13];
251 /* allocate a new AVStream */
252 3 st = avformat_new_stream(s, NULL);
253
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!st)
254 return AVERROR(ENOMEM);
255
256 3 str->channels[channel].audio_stream_index = st->index;
257
258 3 st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
259 3 st->codecpar->codec_id = AV_CODEC_ID_ADPCM_XA;
260 3 st->codecpar->codec_tag = 0; /* no fourcc */
261 3 av_channel_layout_default(&st->codecpar->ch_layout, (fmt & 1) + 1);
262
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 st->codecpar->sample_rate = (fmt&4)?18900:37800;
263 // st->codecpar->bit_rate = 0; //FIXME;
264 3 st->codecpar->block_align = 128;
265
266 3 avpriv_set_pts_info(st, 64, 18 * 224 / st->codecpar->ch_layout.nb_channels,
267 3 st->codecpar->sample_rate);
268 3 st->start_time = 0;
269 }
270 185 pkt = ret_pkt;
271
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 185 times.
185 if ((ret = av_new_packet(pkt, 2304)) < 0)
272 return ret;
273 185 memcpy(pkt->data,sector+24,2304);
274
275 185 pkt->stream_index =
276 185 str->channels[channel].audio_stream_index;
277 185 pkt->duration = 1;
278 185 return 0;
279 case CDXA_TYPE_EMPTY: /* CD-ROM XA, May 1991, 4.3.2.3 */
280 /* NOTE this also catches 0x80 (EOF bit) because of CDXA_TYPE_MASK */
281 /* TODO consider refactoring so as to explicitly handle each case? */
282 break;
283 default:
284 av_log(s, AV_LOG_WARNING, "Unknown sector type %02X\n", sector[0x12]);
285 /* drop the sector and move on */
286 break;
287 }
288
289
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1093 times.
1093 if (avio_feof(pb))
290 return AVERROR(EIO);
291 }
292 }
293
294 3 static int str_read_close(AVFormatContext *s)
295 {
296 3 StrDemuxContext *str = s->priv_data;
297 int i;
298
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 3 times.
99 for(i=0; i<32; i++){
299
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 93 times.
96 if(str->channels[i].tmp_pkt.data)
300 3 av_packet_unref(&str->channels[i].tmp_pkt);
301 }
302
303 3 return 0;
304 }
305
306 const FFInputFormat ff_str_demuxer = {
307 .p.name = "psxstr",
308 .p.long_name = NULL_IF_CONFIG_SMALL("Sony Playstation STR"),
309 .p.flags = AVFMT_NO_BYTE_SEEK,
310 .priv_data_size = sizeof(StrDemuxContext),
311 .read_probe = str_probe,
312 .read_header = str_read_header,
313 .read_packet = str_read_packet,
314 .read_close = str_read_close,
315 };
316

吃槟榔有什么好处和坏处 中药学专业学什么 尾插是什么 半月板损伤有什么症状 活塞是什么
糖宝是什么意思 吃雪燕有什么好处 抽血血液偏黑什么原因 ab型血和b型血的孩子是什么血型 后脑勺出汗多是什么原因
一动就出汗吃什么药 姑息性化疗什么意思 柔五行属什么 friday是什么意思 肝囊肿吃什么药能消除
什么什么自若 balco是什么牌子手表 处女座的幸运色是什么颜色 蜜蜡五行属什么 爱的最高境界是什么
石榴叶子泡水喝有什么功效hcv8jop8ns3r.cn 孕妇羊水多是什么原因造成的hcv8jop0ns4r.cn 男性尿道感染吃什么药hcv9jop6ns1r.cn 吃什么化痰hcv8jop9ns4r.cn 高血压需要注意什么hcv8jop7ns3r.cn
手腕痛挂什么科hcv7jop9ns4r.cn 吃什么补孕酮aiwuzhiyu.com 胸部胀疼是什么原因aiwuzhiyu.com 卧蚕和眼袋有什么区别hcv9jop1ns4r.cn 什么牌子的电饭锅好chuanglingweilai.com
爆菊是什么意思chuanglingweilai.com 吃什么除体内湿气最快hcv9jop0ns5r.cn 可定是什么药hcv7jop7ns4r.cn 一个月来两次大姨妈是什么原因hcv9jop1ns3r.cn taco是什么hcv9jop4ns2r.cn
other什么意思cl108k.com 维生素检查项目叫什么hcv8jop2ns7r.cn 取笑是什么意思hcv8jop6ns5r.cn 萝卜喝醉了会变成什么hcv8jop3ns8r.cn 王久是什么字hcv9jop4ns9r.cn
百度