Writ

From XiphWiki
Revision as of 19:33, 28 October 2004 by 60.25.125.125 (talk)
Jump to: navigation, search

Introduction

Ogg Writ is a text phrase codec. While its primary purpose is to embed subtitles or captions in a Theora stream, its design makes it useful for many other purposes. It could provide lyrics to song encoded in Vorbis, a transcript to a political debate encoded in Speex, or even incorporate a live chat session as part of a continuous video stream.

One of the unique aspects of Writ is its discontinuous nature, that is, unlike other Ogg codecs the granules for which seperate packets effect may overlap. See the Granules and Muxing section below for how this works.


SVN

Current Ogg Writ development is on Xiph SVN as /trunk/writ/. It's being developed to use libogg2, so you'll need both to work on it. The reference encoder and decoder are available as part of the py-ogg2 package which is available on Xiph SVN as /trunk/py-ogg2/.


This is a (near final) working draft of the spec
Writ has been designed so that encoders/decoders can support a bare minimum and be fully compatable with future subversions. Each subversion adds a new feature, some building on others, adding a new header packet and likely a new field to each body packet.

Decoders should ignore header packets beyond what they were written to support and also ignore extra fields in data packets beyond their current version. This allows new features to be added without requiring that all software, or even most software, to support them. <P> We will be conservative about adding future subversions.

Header Packet 0 (BOS, 16 bytes):
 0x00                                   ( 8 bit Header 0)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 version                                ( 8 bit unsigned int, 0 = Alpha)
 subversion                             ( 8 bit unsigned int)
 granulerate_numerator                  (32 bit unsigned int)
 granulerate_denominator                (32 bit unsigned int)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 text_length                            ( 8 bit unsigned integer)
 text_string                            (variable-length UTF-8 string)


<B>Subversion 1 adds multiple language support</B>

Header Packet 1 (Language Definition, 8+ bytes) :
 0x01                                   ( 8 bit Header 1)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 num_languages                          ( 8 bit unsigned int)
 [repeated 1+num_languages times] :
   language_length                      ( 8 bit unsigned int)
   language_string                      (0+language_length rfc3066)
   language_desc_length                 ( 8 bit unsigned int)
   language_desc_string                 (0+language_desc_length UTF-8)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 [repeated num_languages times] :
   text_length                          ( 8 bit unsigned integer)
   text_string                          (variable-length UTF-8 string)


<B>Subversion 2 adds text window support</B>

Header Packet 2 (Window Definition, 10+ bytes) :
 0x02                                   ( 8 bit Header 2)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 location_scale_x                       (16 bit unsigned int)
 location_scale_y                       (16 bit unsigned int)
 num_windows                            ( 8 bit unsigned int)
 [if (window_num > 0) repeated window_num times] :
   location_x                           (variable length, see below)
   location_y                           (variable length, see below)
   location_width                       (variable length, see below)
   location_height                      (variable length, see below)
   alignment_x                          ( 2 bit alignment, see below)
   alignment_y                          ( 2 bit alignment, see below)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 [repeated num_languages times] :
   text_length                          ( 8 bit unsigned integer)
   text_string                          (variable-length UTF-8 string)
 [if (window_num > 1)] :
   window_id                            ( 8 bit unsigned integer)


<B>Example Stream</B>
 Header Packet 0
  version 0
  subversion 2
  granulenum 1
  granuledom 1
 \x00writ\x00\x02\x01\x00\x00\x00\x01\x00\x00\x00

 Header Packet 1
  num_languages 2
   Language 0:
    language en
    language_desc English
   Language 1:
    language es
    language_desc Spanish
 \x01writ\x01\x02en\x07English\x02es\x07Spanish

 Header Packet 2
  location_scale_x 4000 (12 bits)
  location_scale_y 270  ( 9 bits)
  num_windows 2
   Window 0:
    location_x 1
    location_y 2
    location_width 3
    location_height 1
    alignment_x 3 (Full)
    alignment_y 3 (Full)
   Window 1:
    location_x 5
    location_y 6
    location_width 7
    location_height 1
    alignment_x 3 (Full)
    alignment_y 3 (Full)
 \x02writ\xa0\x0f\x0e\x01\x02\x01\x20\x60\x00\x02\x7c\x01\x18\x38\x80\x00\x0f

 Phrase Packet:
  granule_start 5
  granule_duration 10
  Language 0: "Hello World!"
  Language 1: "Hola, Mundo!"
  window_id 0
 \xff\x05\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0cHello World!\x0cHola, Mundo!\x00

 Phrase Packet:
  granule_start 12
  granule_duration 15
  Language 0: "It's a beautiful day to be born."
  Language 1: "Es un día hermoso para que se llevará."
  window_id 1
 \xff\x0c\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x20It's a beautiful day to be born.\x26Es un d\xeda hermoso para que se llevar\xe1.\x01


Granules and Muxing

Granulepos in Writ (as well as future discontinuous codecs) will be by start time, not end time, that the data in a given page is tagged for. This greatly simplifies this specification (see the old method below).

All Writ phrases will be provided at and given the granulepos of their start time, ordered by their start time within the logical bitstream.

Phrase packets with long durations should be repeated in the logical bitstream at regular intervals to ensure that a player seeking to the middle of their duration will still see them. These packet copies will be identical to their original, including the start and duration fields, the granulepos of the page they reside on will be incremented for each copy to place it forward on the logical bitstream.

No two phrases can start on the same granule. On decoding, each packets' start granule is checked against already known packets. If a match is found the new packet is ignored. This prevents phrase copies from being interpreted as new phrases.

Seeking Example


Here is a timeline (granule numbers at top, read down) of a sample stream:

                        <- Granules ->
0000000000111111111122222222223333333333444444444455555555556666666666
0123456789012345678901234567890123456789012345678901234567890123456789
 ___________  ____________  ____________  ____________  _____________
|_Vorbis____||_Vorbis_____||_Vorbis_____||_Vorbis_____||_Vorbis______|
 ____________________   ____________________________________
|_A____________>_____| |_D____________>______________>______|
     _________      ___    __________     ___________
    |_B_______|    |_C_|  |_E________|   |_F_________|

 (note: these have been seperated vertically for easy viewing only)

Packet  Granule Description
 V H0   0       Vorbis Header 0x01 (page by itself)
 W H0   0       Writ Header 0 (page by itself)
 V H1   0       Vorbis Header 0x03
 V H2   0       Vorbis Header 0x05
 W H1   0       Writ Header 1 (Language Defs)
 W H2   0       Writ Header 2 (Window Defs)
 W A    0       Writ Phrase A
 W B    4       Writ Phrase B
 V      12      Vorbis 0-12
 W A    15      Writ Phrase A
 W C    19      Writ Phrase C
 W D    23      Writ Phrase D
 V      26      Vorbis 13-26
 W E    26      Writ Phrase E
 W D    38      Writ Phrase D
 V      40      Vorbis 27-40
 W F    41      Writ Phrase F
 W D    53      Writ Phrase D (EOF)
 V      54      Vorbis 41-54
 V      69      Vorbis 55-69 (EOF)

Player begins decoding at beginning of stream. It reads the BOS pages for both codecs, then receives a non-BOS page. At this point it knows that it has two bitstreams to decode and has resolved that one is Writ and the other Vorbis. It'll continue processing the headers for both.

Next it's going to find two Writ packets (phrases A and B) and toss them into libwrit. Then it'll get to the first Vorbis data page. It now has data from both bitstreams, and it knows (from the granulepos on the Vorbis page) that it has enough data to run until 12. If there were any Writ packets before 12 they would have appeared first.

At around granule 9 the listener seeks forward to 24. This will cause a rapid seek through the file to find the first page with a granulepos greater than the seek position and begin decoding at that point.

It'll find a Vorbis packet containing 13-26 (and not use 13-23) and Writ phrase E. Again, having data from both bitstreams it can begin playing. D would normally appear at granule 24 but is not known about yet. The player knows that this is only enough to decode until 26 so, knowing enough to prebuffer, continues reading the file as it plays the media.

The next packet it finds is Writ phrase D, and passing it to libwrit, is found that the current granulepos is within the duration. It is thus displayed immediatly, as it's prebuffered, without waiting for granulepos 38. It'll keep reading (because the maximum decoded Vorbis is still 26) and find a Vorbis packet with a 40 granulepos.

As it nears 38 it'll read the file again and find Writ phrase F, which takes it out to 41. Vorbis only goes until 40, so it'll have to keep reading until the next Vorbis packet.

Next it'll find Writ phrase D, which will be ignored by libwrit because phrase D is already known (matches start granule of earlier D), and the EOF on that page marks this as the last of the Writ stream.

It'll continue reading for the next Vorbis data and find the packet for granule 54, followed by the Vorbis packet for granule 69. With that it's EOS, EOF, finished.

This is of course a simplistic example, Writ and Vorbis will rarely have granules which equal the same amount of time. Each bitstream has its' own granule -> time mapping which is calculated when muxing concurrent bitstreams within the file. So if there are 44100 Vorbis granules per second and only 4 Writ granules per second, pages would be ordered as W25 V297892 W31 V385932 W39 W41 V463057 etc. The logic used in the above example works after this granule-time mapping is calculated.


Ongoing Discussion

  • How does this get "encoded" and "merged"?
    • <purple_haese> The muxing rule is pages are arranged in ascending order by the timestamp that is represented by their granulepos.
  • For what reason is the 0x00 and 0xFF byte at the beginning of header and data packet respectively?
    • <xiphmont> If, after a seek, I hand your codec a header packet, what does the codec do?
    • <xiphmont> It does *nothing*. If I haven't told it to reset, the header is not data, *it must ignore the header*.
    • <xiphmont> this eliminates a huge raft of special cases in Ogg seeking.


"The Old Way"

The section below is for historical purposes only!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2003/08/17
  In a lengthy discussion with Monty and Derf the decidion to change the
  behavior of discontinuous bitstreams in Ogg, or rather, extend the
  current Ogg specification to handle discontinuous codecs, was made.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The Ogg granulepos of each page is equal to the expiration of the text, packets are ordered by expiration time and may overlap. So, at or before text A is to be displayed, the following sequence is included:

Physical        Text    Text    Text
Location        Packet  Start   Expire  (text expire = page granulepos)
---------------------------------------
00              B       04      14
00              D       19      23
00              C       09      24
00              F       27      34
00              E       26      37
00              G       35      47
00              H       42      54
00              A       00      59
51              I       51      66

So B, D, C, F, E, G, and H are all defined before A, building a FIFO (first in first out) buffer in the player. Encoders should limit the extend of this behavior to reduce nessesary buffer size on the player side by prematurly expiring captions and recreating them periodically.

The screen should not be updated with the new captions until they've all been processed to prevent "flicker". New caption data to the same position will scroll the previous data upwards with no line breaks seperating them (unless present in text). 分子生物学产品 分子蒸馏 粉末涂料生产成套设备 粉末涂装设备 粉碎机 粉体表面改性机械 粉体混合工程设备 风冷式热油泵 氟表面活性剂 氟合金液下泵 氟化铵 氟化氢铵 氟树脂 氟塑料衬里泵 氟塑料衬里阀门 氟塑料衬里隔膜阀 氟塑料衬里截止阀 氟塑料衬里球阀 氟塑料衬里旋塞阀 氟塑料衬里止回阀 氟塑料合金材料 氟塑料合金液下泵 氟塑料喷涂 氟塑料增强合金泵 浮水泵 浮头列管式石墨换热器 釜外循环系统设置 复合机 复合喷丝板 复合橡胶板 干湿纺喷丝头 干式真空泵 干燥机 干燥器 干燥设备 甘油 钢衬复合管 钢衬聚乙烯管道 钢衬塑管道 钢筘 钢瓶 钢丝缠绕胶管 钢丝螺套 钢塑复合管 钢质焊接气瓶 高纯化学品酸 高档挤出复合机 高档塑料制品 高低密度聚乙烯 高低压空温式汽化器 高剪刀混合乳化机 高剪切乳化设备 高精度金属丝 高岭土 高频塑料热合机 高强度聚乙稀PE储运罐 高速分散机 高速离心喷雾干燥机 高速离心造粒干燥机 高速升降搅拌机 高速枕式全自动包装机 高速制管机 高温泵 高温耐腐蚀离心泵 高温液下泵 高效板式密闭过滤机 高效多管除尘器 高效沸腾干燥机 高效粉碎机 高效过滤器 高效换热器 高效活性聚合物驱油剂 高效节能聚四氟乙烯离心泵 高效四氟换热器 高效细粉分离器 高压泵 高压反应釜 高压胶管 高压静电除尘器 高压绝缘子 高压清洗机 高压探测器 高压无缝钢瓶 高真空连续分离成套装置 隔膜泵 隔直流电容器 各类塔器 给排水泵 工程爆破 工程塑料泵 工程塑料阀门 工程陶瓷 工程液压设备 工民建筑 工业泵 工业除尘 工业阀门 工业锅炉 工业级磷酸一铵 工业加湿机 工业冷水机 工业炉 工业热风炉 工业消耗品 工业氧气 工业用离心泵 工业噪音治理 工艺蜡烛 工作梯 供氧装置 固定式沸腾床干燥机 固定箱体式调速型液力偶合器 刮板薄膜蒸发器喷雾干燥机 刮板式薄膜蒸发器 刮刀下卸料离心机 观片灯 观片灯X射线胶片 管道 管道泵 管道附件 管道过滤器 管道配件 管道式无堵塞排污泵 管道式自动增压泵 管道特殊件 管件 管配件 管式热交换器 管束干燥机 灌装机械 罐内封闭阀门 硅胶 硅藻土精滤机 癸二酸铵 辊式破碎机 辊式压力机 滚滴浸绝缘处理设备 滚筒干燥机 滚筒干燥器 锅炉 国标储气桶 过滤分离设备 过滤机 过滤器 过滤器材设备 过滤网 含氮化合物 含氟农药产品 含氟新农药 焊管 焊管生产线 焊接绝热气瓶 合成氨 黑液提取设备 恒压变量自动给水控制设备 喉管 后整理设备 呼吸阀 呼吸人孔 护栏网 滑阀真空泵 滑片式管道泵 化成箔 化工泵 化工泵阀 化工反应釜 化工防腐 化工防腐成套设备 化工管道 化工机械 化工离心泵 化工设备 化工试剂 化工行业筛分机 化工液体 化纤备件 化纤纺丝配件 化纤专件 化学加药装置 化学纤维 化妆品 环保工业用途的真空系统 环保三废治理设备 环保脱硫除尘设备 环保型热熔胶 环保用品 环氧树脂真空浇注设备 缓蚀剂 换热 换热器 换热容器 换热设备 磺化设备 回收净化 混合机 混料机 混流式喷雾干燥机 活塞推料离心机 活性磷酸钙 活性炭 活性炭过滤器 活性碳过滤网 活性碳口罩 活性碳酸钙 活性氧化铝 活性氧化铝球 火灾逃生面具 机械粉碎机 机械过滤器 机械密封件 机械式单缸热熔釜 机械式双缸热熔釜 机械式无级变速器 基因扩增仪 集智能阀门 己二酸 挤出机 挤水机 挤压机 计量泵 加弹机 加氢脱氧纯化装置 加压叶滤机 甲醇 甲醇催化剂 甲醇废水回收甲醇装置 甲醇重整制氢装置 甲醛 甲醛尾气废热锅炉 甲酸铵 钾盐 尖嘴式造粒机 减速器 剪板机 检漏仪 碱回收苛化工段成套设备 建材机械 剑杆织机 浆叶干燥机 降膜式吸收器 降膜吸收器 降膜蒸发器 降凝干加剂 胶带机 胶囊填充设备 胶体磨 胶粘剂 搅拌机 搅拌容器 酵母 接地 接口波纹管 接头 节能浓缩器 洁净地漏 洁净阀门 结晶罐 截止阀 金刚石砂轮 金属表面粗糙度测量仪 金属波纹填料 金属管接头总成 金属检出机 金属筛网 金属压铸机床 金属毡 锦纶 锦纶滤布 腈纶 精馏塔成套装置 精馏塔配套设备 精密阀门 精密过滤器 精密模具 精细过滤器 精细化学品 井用潜水泵 净水设备 静电粉末涂装设备及回收系统 酒精回收塔 酒精蒸馏装置 矩形块孔式石墨换热器 聚氨酯发泡机 聚氨酯连帮成型机 聚氨酯设备 聚丙烯 聚丙烯换热器 聚丙烯聚氯乙烯贮槽 聚丙烯填料塔 聚丙烯真空计量罐 聚磷酸铵 聚氯乙烯绝缘电线电缆 聚偏二氟乙烯 聚四氟乙烯 聚四氟乙烯衬里防腐设备 真空炉 真空浓缩罐 真空浓缩设备 真空排气设备 真空热缩膜机 真空吸滤器 真空压封机 真空压力凝胶设备 真空应用设备 真空制膏机 真石漆专用搅拌机 振动干燥机 振动给料设备 振动机械 振动流化床干燥机 振动螺旋上料机 振动筛 振动筛分设备 振动设备 振动式流动床干燥机 振动输送设备 蒸发浓缩 蒸发器 蒸发式冷凝器 蒸气电加热反应釜 蒸汽电磁阀门 蒸汽加热不锈钢反应锅 蒸汽热油阀 整体PE一次成型无缝无焊储罐 脂肪族 脂环族 轴承 http://www.shop263.com/i-48/649.htm http://www.shop263.com/i-48/650.htm http://www.shop263.com/i-48/651.htm http://www.shop263.com/i-48/652.htm http://www.shop263.com/i-48/653.htm http://www.shop263.com/i-48/654.htm http://www.shop263.com/i-48/655.htm http://www.shop263.com/i-48/656.htm http://www.shop263.com/i-48/657.htm http://www.shop263.com/i-48/658.htm http://www.shop263.com/i-48/659.htm http://www.shop263.com/i-48/660.htm http://www.shop263.com/i-48/661.htm http://www.shop263.com/i-48/662.htm http://www.shop263.com/i-48/663.htm http://www.shop263.com/i-48/664.htm http://www.shop263.com/i-48/665.htm http://www.shop263.com/i-48/666.htm http://www.shop263.com/i-48/667.htm http://www.shop263.com/i-48/668.htm http://www.shop263.com/i-48/669.htm http://www.shop263.com/i-48/670.htm http://www.shop263.com/i-48/671.htm http://www.shop263.com/i-48/672.htm http://www.shop263.com/i-48/673.htm http://www.shop263.com/i-48/674.htm http://www.shop263.com/i-48/675.htm http://www.shop263.com/i-48/676.htm http://www.shop263.com/i-48/677.htm http://www.shop263.com/i-48/678.htm http://www.shop263.com/i-48/679.htm http://www.shop263.com/i-48/680.htm http://www.shop263.com/i-48/681.htm http://www.shop263.com/i-48/682.htm http://www.shop263.com/i-48/683.htm http://www.shop263.com/i-48/684.htm http://www.shop263.com/i-48/685.htm http://www.shop263.com/i-48/686.htm http://www.shop263.com/i-48/687.htm http://www.shop263.com/i-48/688.htm http://www.shop263.com/i-48/689.htm http://www.shop263.com/i-48/690.htm http://www.shop263.com/i-48/691.htm http://www.shop263.com/i-48/692.htm http://www.shop263.com/i-48/693.htm http://www.shop263.com/i-48/694.htm http://www.shop263.com/i-48/695.htm http://www.shop263.com/i-48/696.htm http://www.shop263.com/i-48/697.htm http://www.shop263.com/i-48/698.htm http://www.shop263.com/i-48/699.htm http://www.shop263.com/i-48/700.htm http://www.shop263.com/i-48/701.htm http://www.shop263.com/i-48/702.htm http://www.shop263.com/i-48/703.htm http://www.shop263.com/i-48/704.htm http://www.shop263.com/i-48/705.htm http://www.shop263.com/i-48/706.htm http://www.shop263.com/i-48/707.htm http://www.shop263.com/i-48/708.htm http://www.shop263.com/i-48/709.htm http://www.shop263.com/i-48/710.htm http://www.shop263.com/i-48/711.htm http://www.shop263.com/i-48/712.htm http://www.shop263.com/i-48/713.htm http://www.shop263.com/i-48/714.htm http://www.shop263.com/i-48/715.htm http://www.shop263.com/i-48/716.htm http://www.shop263.com/i-48/717.htm http://www.shop263.com/i-48/718.htm http://www.shop263.com/i-48/719.htm http://www.shop263.com/i-48/720.htm http://www.shop263.com/i-48/721.htm http://www.shop263.com/i-48/722.htm http://www.shop263.com/i-48/723.htm http://www.shop263.com/i-48/724.htm http://www.shop263.com/i-48/725.htm http://www.shop263.com/i-48/726.htm http://www.shop263.com/i-48/727.htm http://www.shop263.com/i-48/728.htm http://www.shop263.com/i-48/729.htm http://www.shop263.com/i-48/730.htm http://www.shop263.com/i-48/731.htm http://www.shop263.com/i-48/732.htm http://www.shop263.com/i-48/733.htm http://www.shop263.com/i-48/734.htm http://www.shop263.com/i-48/735.htm http://www.shop263.com/i-48/736.htm http://www.shop263.com/i-48/737.htm http://www.shop263.com/i-48/738.htm http://www.shop263.com/i-48/739.htm http://www.shop263.com/i-48/740.htm http://www.shop263.com/i-48/741.htm http://www.shop263.com/i-48/742.htm http://www.shop263.com/i-48/743.htm http://www.shop263.com/i-48/744.htm http://www.shop263.com/i-48/745.htm http://www.shop263.com/i-48/746.htm http://www.shop263.com/i-48/747.htm http://www.shop263.com/i-48/748.htm http://www.shop263.com/i-48/749.htm http://www.shop263.com/i-48/750.htm http://www.shop263.com/i-48/751.htm http://www.shop263.com/i-48/752.htm http://www.shop263.com/i-48/753.htm http://www.shop263.com/i-48/754.htm http://www.shop263.com/i-48/755.htm http://www.shop263.com/i-48/756.htm http://www.shop263.com/i-48/757.htm http://www.shop263.com/i-48/758.htm http://www.shop263.com/i-48/759.htm http://www.shop263.com/i-48/760.htm http://www.shop263.com/i-48/761.htm http://www.shop263.com/i-48/762.htm http://www.shop263.com/i-48/763.htm http://www.shop263.com/i-48/764.htm http://www.shop263.com/i-48/765.htm http://www.shop263.com/i-48/766.htm http://www.shop263.com/i-48/767.htm http://www.shop263.com/i-48/768.htm http://www.shop263.com/i-48/769.htm http://www.shop263.com/i-48/770.htm http://www.shop263.com/i-48/771.htm http://www.shop263.com/i-48/772.htm http://www.shop263.com/i-48/773.htm http://www.shop263.com/i-48/774.htm http://www.shop263.com/i-48/775.htm http://www.shop263.com/i-48/776.htm http://www.shop263.com/i-48/777.htm http://www.shop263.com/i-48/778.htm http://www.shop263.com/i-48/779.htm http://www.shop263.com/i-48/780.htm http://www.shop263.com/i-48/781.htm http://www.shop263.com/i-48/782.htm http://www.shop263.com/i-48/783.htm http://www.shop263.com/i-48/784.htm http://www.shop263.com/i-48/785.htm http://www.shop263.com/i-48/786.htm http://www.shop263.com/i-48/787.htm http://www.shop263.com/i-48/788.htm http://www.shop263.com/i-48/789.htm http://www.shop263.com/i-48/790.htm http://www.shop263.com/i-48/791.htm http://www.shop263.com/i-48/792.htm http://www.shop263.com/i-48/793.htm http://www.shop263.com/i-48/794.htm http://www.shop263.com/i-48/795.htm http://www.shop263.com/i-48/796.htm http://www.shop263.com/i-48/797.htm http://www.shop263.com/i-48/798.htm http://www.shop263.com/i-48/799.htm http://www.shop263.com/i-48/800.htm http://www.shop263.com/i-48/801.htm http://www.shop263.com/i-48/802.htm http://www.shop263.com/i-48/803.htm http://www.shop263.com/i-48/804.htm http://www.shop263.com/i-48/805.htm http://www.shop263.com/i-48/806.htm http://www.shop263.com/i-48/807.htm http://www.shop263.com/i-48/808.htm http://www.shop263.com/i-48/809.htm http://www.shop263.com/i-48/800.htm http://www.shop263.com/i-48/811.htm http://www.shop263.com/i-48/812.htm http://www.shop263.com/i-48/813.htm http://www.shop263.com/i-48/814.htm http://www.shop263.com/i-48/815.htm http://www.shop263.com/i-48/816.htm http://www.shop263.com/i-48/817.htm http://www.shop263.com/i-48/818.htm http://www.shop263.com/i-48/819.htm http://www.shop263.com/i-48/820.htm http://www.shop263.com/i-48/821.htm http://www.shop263.com/i-48/822.htm http://www.shop263.com/i-48/823.htm http://www.shop263.com/i-48/824.htm http://www.shop263.com/i-48/825.htm http://www.shop263.com/i-48/826.htm http://www.shop263.com/i-48/827.htm http://www.shop263.com/i-48/828.htm http://www.shop263.com/i-48/829.htm http://www.shop263.com/i-48/830.htm http://www.shop263.com/i-48/831.htm http://www.shop263.com/i-48/832.htm http://www.shop263.com/i-48/833.htm http://www.shop263.com/i-48/834.htm http://www.shop263.com/i-48/835.htm http://www.shop263.com/i-48/836.htm http://www.shop263.com/i-48/837.htm http://www.shop263.com/i-48/838.htm http://www.shop263.com/i-48/839.htm http://www.shop263.com/i-48/840.htm http://www.shop263.com/i-48/841.htm http://www.shop263.com/i-48/842.htm http://www.shop263.com/i-48/843.htm http://www.shop263.com/i-48/844.htm http://www.shop263.com/i-48/845.htm http://www.shop263.com/i-48/846.htm http://www.shop263.com/i-48/847.htm http://www.shop263.com/i-48/848.htm http://www.shop263.com/i-48/849.htm http://www.shop263.com/i-48/850.htm http://www.shop263.com/i-48/851.htm http://www.shop263.com/i-48/852.htm http://www.shop263.com/i-48/853.htm http://www.shop263.com/i-48/854.htm http://www.shop263.com/i-48/855.htm http://www.shop263.com/i-48/856.htm http://www.shop263.com/i-48/857.htm http://www.shop263.com/i-48/858.htm http://www.shop263.com/i-48/859.htm http://www.shop263.com/i-48/860.htm http://www.shop263.com/i-48/861.htm http://www.shop263.com/i-48/862.htm http://www.shop263.com/i-48/863.htm http://www.shop263.com/i-48/864.htm http://www.shop263.com/i-48/865.htm http://www.shop263.com/i-48/866.htm http://www.shop263.com/i-48/867.htm http://www.shop263.com/i-48/868.htm http://www.shop263.com/i-48/869.htm http://www.shop263.com/i-48/870.htm http://www.shop263.com/i-48/871.htm http://www.shop263.com/i-48/872.htm http://www.shop263.com/i-48/873.htm http://www.shop263.com/i-48/874.htm http://www.shop263.com/i-48/875.htm http://www.shop263.com/i-48/876.htm http://www.shop263.com/i-48/877.htm http://www.shop263.com/i-48/878.htm http://www.shop263.com/i-48/879.htm http://www.shop263.com/i-48/880.htm http://www.shop263.com/i-48/881.htm http://www.shop263.com/i-48/882.htm http://www.shop263.com/i-48/883.htm http://www.shop263.com/i-48/884.htm http://www.shop263.com/i-48/885.htm http://www.shop263.com/i-48/886.htm http://www.shop263.com/i-48/887.htm http://www.shop263.com/i-48/888.htm http://www.shop263.com/i-48/889.htm http://www.shop263.com/i-48/890.htm http://www.shop263.com/i-48/891.htm http://www.shop263.com/i-48/892.htm http://www.shop263.com/i-48/893.htm http://www.shop263.com/i-48/894.htm http://www.shop263.com/i-48/895.htm http://www.shop263.com/i-48/896.htm http://www.shop263.com/i-48/897.htm http://www.shop263.com/i-48/898.htm http://www.shop263.com/i-48/899.htm http://www.shop263.com/i-48/900.htm http://www.shop263.com/i-48/901.htm http://www.shop263.com/i-48/902.htm http://www.shop263.com/i-48/903.htm http://www.shop263.com/i-48/904.htm http://www.shop263.com/i-48/905.htm http://www.shop263.com/i-48/906.htm http://www.shop263.com/i-48/907.htm http://www.shop263.com/i-48/908.htm http://www.shop263.com/i-48/909.htm http://www.shop263.com/i-48/910.htm http://www.shop263.com/i-48/911.htm http://www.shop263.com/i-48/912.htm http://www.shop263.com/i-48/913.htm http://www.shop263.com/i-48/914.htm http://www.shop263.com/i-48/915.htm http://www.shop263.com/i-48/916.htm http://www.shop263.com/i-48/917.htm http://www.shop263.com/i-48/918.htm http://www.shop263.com/i-48/919.htm http://www.shop263.com/i-48/920.htm http://www.shop263.com/i-48/921.htm http://www.shop263.com/i-48/922.htm http://www.shop263.com/i-48/923.htm http://www.shop263.com/i-48/924.htm http://www.shop263.com/i-48/925.htm http://www.shop263.com/i-48/926.htm http://www.shop263.com/i-48/927.htm http://www.shop263.com/i-48/928.htm http://www.shop263.com/i-48/929.htm http://www.shop263.com/i-48/930.htm http://www.shop263.com/i-48/931.htm http://www.shop263.com/i-48/932.htm http://www.shop263.com/i-48/933.htm http://www.shop263.com/i-48/934.htm http://www.shop263.com/i-48/935.htm http://www.shop263.com/i-48/936.htm http://www.shop263.com/i-48/937.htm http://www.shop263.com/i-48/938.htm http://www.shop263.com/i-48/939.htm http://www.shop263.com/i-48/940.htm http://www.shop263.com/i-48/941.htm http://www.shop263.com/i-48/942.htm http://www.shop263.com/i-48/943.htm http://www.shop263.com/i-48/944.htm http://www.shop263.com/i-48/945.htm http://www.shop263.com/i-48/946.htm http://www.shop263.com/i-48/947.htm http://www.shop263.com/i-48/948.htm http://www.shop263.com/i-48/949.htm http://www.shop263.com/i-48/950.htm http://www.shop263.com/i-48/951.htm http://www.shop263.com/i-48/952.htm http://www.shop263.com/i-48/953.htm http://www.shop263.com/i-48/954.htm http://www.shop263.com/i-48/955.htm http://www.shop263.com/i-48/956.htm http://www.shop263.com/i-48/957.htm http://www.shop263.com/i-48/958.htm http://www.shop263.com/i-48/959.htm http://www.shop263.com/i-48/960.htm http://www.shop263.com/i-48/961.htm http://www.shop263.com/i-48/962.htm http://www.shop263.com/i-48/963.htm http://www.shop263.com/i-48/964.htm http://www.shop263.com/i-48/965.htm http://www.shop263.com/i-48/966.htm http://www.shop263.com/i-48/967.htm http://www.shop263.com/i-48/968.htm http://www.shop263.com/i-48/969.htm http://www.shop263.com/i-48/970.htm http://www.shop263.com/i-48/971.htm http://www.shop263.com/i-48/972.htm http://www.shop263.com/i-48/973.htm http://www.shop263.com/i-48/974.htm

http://www.shop263.com/i-48/975.htm