System for handling streaming information using a plurality of reader modules by enumerating output pins and associated streams of information
Summary by NHIP
Multi-Position Circular Buffer Streaming
The method handles multiple broadcast channels by writing data to a circular buffer while reading streams from two distinct positions simultaneously. A control algorithm prevents overwriting data at either the first or second location, and read positions shift adjacent to the write position upon receiving a user channel selection request.
Claim Score by NHIP
Abstract
An information appliance receives streaming information. The information appliance includes a storage buffer and a writer module which receives the streaming information and writes the streaming information to the buffer. A plurality of reader modules are configurable to read the streaming information from the buffer independently of one another.

Term
Term ended
Expired 19 December 2020, 5.8 years ago.
- Priority
- Filed
- Granted
- Expired
- Today
14 claims: 2 independent, 12 dependent
- 1A method of handling streaming information comprising multiple broadcast channels that includes at least one channel comprised of a plurality of streams of information, comprising:receiving streaming information: writing the streaming information to a circular buffer at a write position;reading each of the plurality of streams in the channel of the streaming information from a first read position in the buffer;simultaneously and independently reading the streaming information from a second read position in the buffer;utilizing a control algorithm to prevent the written streaming information on the circular buffer from being written over when being read from either the first location or the second location;receiving a request from a user to select one of the multiple broadcast channels of the streaming information;and providing an object which exposes a method to receive the identifier request and, in response, enumerate a set of outputs;and adjusting either the first read position and/or the second read position to be adjacent the write position when the request is received.
- 10Broadest claimClaim Score 58, broad(NHIP)A method of handling streaming information that includes at least one channel comprised of a plurality of streams of information, comprising:writing the streaming information to a circular buffer at a write position;reading each of the plurality of streams in the channel of the streaming information from a first location in the buffer at a first read position;simultaneously and independently reading the streaming information from a second location in the buffer at a second read position;utilizing a control algorithm to prevent the streaming information from being read from either the first location or the second location when the information is being written to the circular buffer;receiving a request from a user to select one of the multiple broadcast channels of the streaming information;providing an object which exposes a method to receive the identifier request and, in response, enumerate the set of outputs;and adjusting either the first read position and/or the second read position to be adjacent the write position when the request is received.
Independent claims2
198 paragraphs in 5 sections, as filed
REFERENCE TO CO-PENDING APPLICATIONS
The present application is a continuation of and claims priority of U.S. patent application Ser. No. 10/827,619, filed on Apr. 19, 2004, which is a continuation of U.S. patent application Ser. No. 09/286,808, filed Apr. 6, 1999, now U.S. Pat. No. 6,748,481, issued Jun. 8, 2004; the contents of both aforementioned applications are hereby incorporated by reference in their entirety.
BACKGROUND OF THE INVENTION
The present invention relates to streaming information. More particularly, the present invention relates to recording streaming information and retrieving the stored information for selective playback.
With advances in technology including faster processors, improved graphics, and so forth, a desktop computer can easily receive and present streaming information to the user. Common examples of streaming information include streaming video and audio delivered over a wide area network, such as the Internet. For instance, television broadcast signals that would otherwise be transmitted wirelessly using satellites, television transmitters, etc., are encoded and made available for transmission to remote computer users via the Internet. Upon request by the desktop computer user, the encoded data packets containing audio and video data are sent to the desktop computer user sequentially. Upon receipt, the data packets are decoded and processed by the desktop computer in order to render the streaming information to the user in as close to real time as possible. After rendering or presentation, the data packets are discarded.
Although processing streaming information in the manner described above is useful, there exist a number of shortcomings. Currently, streaming information is provided at the request of each desktop computer. Thus, each user must form a separate connection with the source of streaming information in order to receive the desired streaming information. Once initiated, the user is unable to control the manner in which streaming information is rendered. For instance, the user cannot temporarily “pause” the incoming streaming information in order to perform another task and then resume viewing when desired. Likewise, the user is unable to repeat a previously rendered portion since the data packets are discarded, or skip ahead since the data packets have not been received.
There thus is an ongoing need to improve the manner in which streaming information is rendered. Although described above with respect to a desktop computer and streaming information received from the Internet, the improved process should be applicable to other information appliances or computing devices and other forms of streaming information.
SUMMARY OF THE INVENTION
An information appliance receives streaming information. The information appliance includes a storage buffer and a writer module which receives the streaming information and writes the streaming information to the buffer. A plurality of reader modules are configurable to read the streaming information from the buffer independently of one another.
In accordance with another feature of the present invention, the streaming information includes at least one channel comprised of a plurality of streams of information. The reader modules each include a plurality of output pins, one of the plurality of streams being provided by the reader module on each output pin. An interface is associated with each of the plurality of reader modules. The interfaces are configured to identify the plurality of output pins corresponding to the reader module associated with the interface.
BRIEF DESCRIPTION OF THE DRAWINGS
<figref idref="DRAWINGS">FIG. 1</figref> is a block diagram of a first exemplary environment for the present invention.
<figref idref="DRAWINGS">FIG. 2</figref> is a block diagram of a second exemplary environment for the present invention.
<figref idref="DRAWINGS">FIG. 3</figref> is a perspective view of a mobile device.
<figref idref="DRAWINGS">FIG. 4</figref> is a block diagram of a third exemplary environment for the present invention.
<figref idref="DRAWINGS">FIG. 5</figref> is a system for processing streaming information.
<figref idref="DRAWINGS">FIG. 6</figref> is a block diagram of a delay filter.
<figref idref="DRAWINGS">FIG. 7</figref> is a block diagram of delay filter <b>112</b> showing an interface to a circular buffer in the filter.
<figref idref="DRAWINGS">FIG. 8</figref> is a diagram illustrating the circular buffer <b>124</b> along a linear time line.
<figref idref="DRAWINGS">FIGS. 9A and 9B</figref> together form a flow chart for a write portion of a synchronization algorithm according to one embodiment of the present invention.
<figref idref="DRAWINGS">FIG. 10</figref> is a diagram illustrating advancement of a Tail Pointer variable within the circular buffer.
<figref idref="DRAWINGS">FIGS. 11A and 11B</figref> together illustrate a flow chart for a read portion of the synchronization algorithm according to one embodiment of the present invention.
<figref idref="DRAWINGS">FIG. 12</figref> is a diagram illustrating an example of the circular buffer when a reader module has overtaken a writer module.
<figref idref="DRAWINGS">FIG. 13</figref> is a diagram illustrating a status register which is maintained for each data channel for specifying which user operations are permitted or prohibited in a present state of the channel.
<figref idref="DRAWINGS">FIG. 14</figref> is a table listing examples of user operations corresponding to user operation fields UOP<b>0</b>-UOP<b>10</b> in <figref idref="DRAWINGS">FIG. 13</figref>.
<figref idref="DRAWINGS">FIG. 15</figref> is a flow chart of a software object that is called by an application in response to a user operation request.
<figref idref="DRAWINGS">FIG. 16</figref> is a flow chart illustrating steps performed by the delay filter in maintaining the user operation bits of the status register shown in <figref idref="DRAWINGS">FIG. 13</figref>.
<figref idref="DRAWINGS">FIG. 17</figref> is a pictorial representation of a data block.
<figref idref="DRAWINGS">FIG. 18</figref> is a pictorial representation of a first sequence of data blocks.
<figref idref="DRAWINGS">FIG. 19</figref> is a pictorial representation of a second sequence of data blocks.
<figref idref="DRAWINGS">FIG. 20</figref> is a block diagram of another embodiment of a system in accordance with the present invention.
<figref idref="DRAWINGS">FIG. 20A</figref> is a block diagram of an example of a filter graph.
<figref idref="DRAWINGS">FIGS. 21A-21D</figref> are block diagrams illustrating stream analysis.
<figref idref="DRAWINGS">FIGS. 22-23C</figref> are flow diagrams illustrating stream analysis.
<figref idref="DRAWINGS">FIG. 24</figref> is a flow diagram illustrating indexing.
<figref idref="DRAWINGS">FIG. 25</figref> is an illustration of a portion of a data buffer.
<figref idref="DRAWINGS">FIG. 26</figref> is a flow diagram illustrating a seeking operation.
DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS
Overview
<figref idref="DRAWINGS">FIG. 1</figref> and the related discussion are intended to provide a brief, general description of a first exemplary computing environment in which the invention may be implemented. Although not required, the invention will be described, at least in part, in the general context of processor executable instructions, such as program modules being executed by a controller, processor, a personal computer or other computing device. Generally, program modules include routine programs, objects, components, data structures, etc., that perform particular tasks or implement particular abstract data types. Tasks performed by the program modules are described below and with the aid of block diagrams and flowcharts. Those skilled in the art can implement the description, block diagrams and flowcharts to processor executable instructions, which can be written on computer readable mediums. In addition, those skilled in the art will appreciate that the invention may be practiced with other information appliances, including hand-held devices, multiprocessor systems, microprocessor-based or programmable consumer electronics, network PCs, minicomputers, mainframe computers, and the like. The invention is also applicable in distributed computing environments where tasks are performed by remote processing devices that are linked through a communications network. In a distributed computing environment, program modules may be located in both local and remote memory storage devices.
With reference to <figref idref="DRAWINGS">FIG. 1</figref>, the first exemplary environment for the invention includes a general purpose computing device in the form of a conventional personal computer <b>20</b>, including processing unit <b>21</b>, a system memory <b>22</b>, and a system bus <b>23</b> that couples various system components including the system memory to processing unit <b>21</b>. System bus <b>23</b> may be any of several types of bus structures including a memory bus or memory controller, a peripheral bus, and a local bus using any of a variety of bus architectures. The system memory includes read only memory (ROM) <b>24</b> and random access memory (RAM) <b>25</b>. A basic input/output system <b>26</b> (BIOS), containing the basic routine that helps to transfer information between elements within personal computer <b>20</b>, such as during start-up, is stored in ROM <b>24</b>. Personal computer <b>20</b> further includes a hard disk drive <b>27</b> for reading from and writing to a hard disk (not shown), a magnetic disk drive <b>28</b> for reading from or writing to removable magnetic disk <b>29</b>, and an optical disk drive <b>30</b> for reading from or writing to a removable optical disk <b>31</b> such as a CD ROM or other optical medium. Hard disk drive <b>27</b>, magnetic disk drive <b>28</b>, and optical disk drive <b>30</b> are connected to system bus <b>23</b> by a hard disk drive interface <b>32</b>, magnetic disk drive interface <b>33</b>, and an optical drive interface <b>34</b>, respectively. The drives and the associated computer readable medium provide nonvolatile storage of computer readable instructions, data structures, program modules and other data for personal computer <b>20</b>.
Although the exemplary environment described herein employs a hard disk, a removable magnetic disk <b>29</b> and a removable optical disk <b>31</b>, it should be appreciated by those skilled in the art that other types of computer readable medium which can store data that is accessible by a computer, such as magnetic cassettes, flash memory cards, digital video disks, Bernoulli cartridges, random access memories (RAMs), read only memory (ROM), and the like, may also be used in the exemplary operating environment.
A number of program modules may be stored on hard disk, magnetic disk <b>29</b>, optical disk <b>31</b>, ROM <b>24</b> or RAM <b>25</b>, including an operating system <b>35</b>, one or more application programs <b>36</b>, other program modules <b>37</b>, and program data <b>38</b>. A user may enter commands and information into personal computer <b>20</b> through input devices such as a keyboard <b>40</b> and pointing device (mouse) <b>42</b>. Other input devices (not shown) may include a microphone, joystick, game pad, satellite dish, scanner, or the like. These and other input devices are often connected to processing unit <b>21</b> through a serial port interface <b>46</b> that is coupled to system bus <b>23</b>, but may be connected by other interfaces, such as a sound card, a parallel port, a game port or a universal serial bus (USB). A monitor <b>47</b> or other type of display device is also connected to system bus <b>23</b> via an interface, such as a video adapter <b>48</b>. In addition to monitor <b>47</b>, personal computers may typically include other peripheral output devices such as a speaker <b>49</b> connected to a sound card <b>57</b> and printers (not shown).
Personal computer <b>20</b> may operate in a networked environment using logic connections to one or more remote computers, such as a remote computer <b>49</b>. Remote computer <b>49</b> may be another personal computer, a server, a router, a network PC, a peer device or other network node, and typically includes many or all of the elements described above relative to personal computer <b>20</b>, although only a memory storage device <b>50</b> has been illustrated in <figref idref="DRAWINGS">FIG. 1</figref>. The logic connections depicted in <figref idref="DRAWINGS">FIG. 1</figref> include a local are network (LAN) <b>51</b> and a wide area network (WAN) <b>52</b>. Such networking environments are commonplace in offices, enterprise-wide computer network Intranets and the Internet.
When used in a LAN networking environment, personal computer <b>20</b> is connected to local area network <b>51</b> through a network interface or adapter <b>53</b>. When used in a WAN networking environment, personal computer <b>20</b> typically includes a modem <b>54</b> or other means for establishing communications over wide area network <b>52</b>, such as the Internet. Modem <b>54</b>, which may be internal or external, is connected to system bus <b>23</b> via serial port interface <b>46</b>. In a network environment, program modules depicted relative to personal computer <b>20</b>, or portions thereof, may be stored in the remote memory storage devices. It will be appreciated that the network connections shown are exemplary and other means of establishing a communications link between the computers may be used.
Streaming information can be received by computer <b>20</b> using a number of known methods and technologies. Commonly, a source of streaming information is a remote computer wherein computer <b>21</b> is connected to the remote computer using a wired or wireless modem. This technique is used often when streaming information is provided through an intranet or the Internet, typically in digital form. Digital streaming information can further comprise satellite signals received by a satellite receiver, dish or the like.
However, streaming information can also arrive as analog signals. For instance, the streaming information can also comprise broadcast radio or television signals. In such cases, computer <b>20</b> includes a radio tuner <b>60</b> and a television tuner <b>62</b> to receive the broadcast signals and convert the analog signals to digital form for transmission over system bus <b>23</b>.
It should be understood that the present invention can be used in other computing devices besides computer <b>20</b>, discussed above. <figref idref="DRAWINGS">FIG. 2</figref> is a block diagram of a mobile device <b>68</b>, which is another exemplary computing environment. Mobile device <b>68</b> includes a microprocessor <b>70</b>, memory <b>72</b>, input/output (I/O) components <b>74</b>, a communication interface <b>76</b> for communicating with, for example, computer <b>20</b>. In a one embodiment, the afore-mentioned components are coupled for communication with one another over a suitable bus <b>78</b>.
Memory <b>72</b> is implemented as non-volatile electronic memory such as random access memory (RAM) with a battery back-up module (not shown) such that information stored in memory <b>72</b> is not lost when the general power to mobile device <b>68</b> is shut down. A portion of memory <b>72</b> is preferably allocated as addressable memory for program execution, while another portion of memory <b>72</b> is preferably used for storage, such as to simulate storage on a disc drive.
Memory <b>72</b> includes an operating system <b>80</b>, an application program <b>82</b> as well as an object store <b>84</b>. During operation, operating system <b>80</b> is preferably executed by processor <b>70</b> from memory <b>72</b>. Operating system <b>80</b>, in one preferred embodiment, is a “WINDOWS CE” brand operating system commercially available from Microsoft Corporation. Operating system <b>80</b> is preferably designed for mobile devices, and implements database features which can be utilized by application <b>82</b> through a set of exposed application programming interfaces and methods. The objects in object store <b>84</b> are maintained by application <b>82</b> and operating system <b>80</b>, at least partially in response to calls to the exposed application programming interfaces and methods.
Communication interface <b>76</b> represents numerous devices and technologies that allow mobile device <b>68</b> to receive streaming information. The devices are similar to those discussed above with respect to computer <b>20</b> and include wired and wireless modems, satellite receivers and broadcast tuners to name a few. Mobile device <b>68</b> can also be directly connected to computer <b>20</b> to exchange data therewith. In such cases, communication interface <b>76</b> can be an infrared transceiver or a serial or parallel communication connection, all of which are capable of transmitting streaming information.
<figref idref="DRAWINGS">FIG. 3</figref> is a simplified pictorial illustration of mobile device <b>68</b>. Mobile device <b>68</b> can be a desktop assistant sold under the designation H/PC having software provided by the Microsoft Corporation. In one embodiment, mobile device <b>18</b> includes a miniaturized keyboard <b>83</b>, display <b>85</b> and stylus <b>86</b>. In the embodiment shown in <figref idref="DRAWINGS">FIG. 3</figref>, display <b>85</b> is a liquid crystal display (LCD) which uses a contact sensitive display screen in conjunction with stylus <b>86</b>. Stylus <b>86</b> is used to press or contact display <b>85</b> at designated coordinates to accomplish certain user input functions. Miniaturized keyboard <b>83</b> is preferably implemented as a miniaturized alpha-numeric keyboard, with any suitable and desired function keys, which are provided for accomplishing certain user input functions. In other known embodiments, keyboard <b>83</b> is omitted and a “soft” keyboard is provided through the contact sensitive display screen. In yet other embodiments, a character recognition module is employed to recognize characters written on the contact sensitive display screen using stylus <b>86</b>.
<figref idref="DRAWINGS">FIG. 4</figref> illustrates yet another exemplary environment in which the present invention can operate. In <figref idref="DRAWINGS">FIG. 4</figref>, an entertainment appliance <b>90</b> is illustrated and includes processing unit <b>21</b>, system memory <b>22</b> and system bus <b>23</b>. Hard disk drive <b>27</b>, or any of the other storage devices described above, are further coupled to system bus <b>23</b> and used for temporary and permanent storage of program applications, data, etc. Unlike typical desktop computers such as computer <b>20</b> described above, entertainment appliance <b>90</b> may use a limited input device such as a handheld remote <b>92</b> operable with a receiver <b>94</b>, which can be an infrared receiver, wireless receiver, or the like. In entertainment appliance <b>90</b>, information is rendered to the user using monitor <b>47</b> or other display device that is coupled to system bus <b>23</b> with video adapter <b>48</b>. Audio information is also rendered and illustrated herein with speaker <b>49</b>. Speaker <b>49</b> is coupled to system bus <b>23</b> with sound card <b>57</b>, which can be combined with video adapter <b>48</b> to form a signal device, if desired. It should be further understood that audio and video information could be provided to external components, such as amplifiers or the like, which in turn, are connected to monitor <b>47</b> and speakers <b>49</b>.
Streaming information is provided to entertainment appliance <b>90</b> through a communications interface <b>98</b>. Communications interface <b>98</b> can be any of the devices and technologies described above with respect to the two previous environments.
Delay Filter
<figref idref="DRAWINGS">FIG. 5</figref> is a general block diagram illustrating a system <b>110</b> for processing streaming information. System <b>110</b> includes a delay filter <b>112</b> for temporarily storing streaming information received from a streaming information source <b>114</b>. Delay filter <b>112</b> is further coupled to a rendering device or devices <b>116</b> to render streaming information upon request by the user. Also illustrated in <figref idref="DRAWINGS">FIG. 5</figref> is an encoder <b>118</b> and a decoder <b>120</b>. Although not required, encoder <b>118</b> and decoder <b>120</b> can improve system performance wherein encoder <b>118</b> receives streaming information source <b>114</b> and compresses the streaming information prior to transfer and storage in delay filter <b>112</b>. Decoder <b>120</b> receives the streaming information temporarily stored in delay filter <b>112</b> in the compressed format and uncompresses the streaming information prior to transferring the streaming information to rendering device <b>116</b>.
At this point, it should be noted that system <b>110</b> can be operated in any of the computing environments described above, or similar computing environments. Those skilled in the art will appreciate that delay filter <b>112</b>, rendering device <b>116</b>, encoder <b>118</b> and decoder <b>120</b> can be implemented in hardware, software, or combinations thereof. In one embodiment by way of example, delay filter <b>112</b> is embodied in the operating system. Higher level application programs or other portions of the operating systems can access functions of delay filter <b>112</b> using application program interfaces (APIs) as is well known in the art.
In operation, streaming information source <b>114</b> provides an information stream to delay filter <b>112</b> (optionally through encoder <b>118</b>). Generally, the streaming information comprises digital data representing one or more channels of content information. For instance, streaming information source <b>114</b> can comprise an Intranet or the Internet available through the communication interfaces described above. Likewise, streaming information source <b>114</b> can comprise an analog or digital television tuner wherein separate audio, video and data (e.g. closed captioning) information streams comprise a single channel. Other sources of streaming information include, but are not limited to, audio tuners, satellite receivers and the like.
In the embodiment illustrated, encoder <b>118</b> receives the streaming information and encodes or compresses the streaming information into a known format such as “MPEG”, “AVI”, “MOV” (Apple®QuickTime®) and “WAV”, although, if used, the present invention is not limited to any one particular encoding format.
Generally, as discussed below, delay filter <b>112</b> includes a writer module <b>122</b>, a circular buffer <b>124</b> and one or more reader modules <b>126</b>. Writer module <b>122</b> receives the streaming information provided by streaming information source <b>114</b> and writes the streaming information into circular buffer <b>124</b>. Circular buffer <b>124</b> can comprise any of the storage devices described above, for example, hard disk <b>27</b> or RAM memory. Reader module <b>126</b> accesses circular buffer <b>124</b> to retrieve the streaming information when the streaming information is to be rendered. If the streaming information stored in circular buffer <b>124</b> is encoded or compressed, decoder <b>120</b> decodes or uncompresses the streaming information, which is then provided to rendering device <b>116</b>.
<figref idref="DRAWINGS">FIG. 6</figref> is a more detailed pictorial representation of delay filter <b>112</b>. In this illustrated embodiment, the streaming information comprises a television signal or channel that includes audio, video and data (closed captioning) streams. The streaming information is first provided to a stream analyzer <b>130</b>, which analyzes the incoming streams and provides such information as synchronization points that may be present in each of the streams. Synchronization points are used in rendering some types of streaming information and are discussed in detail below.
Streaming information and synchronization point information is provided to writer module <b>122</b>. In one embodiment, as illustrated, writer module <b>122</b> comprises a mux writer that receives multi-stream streaming information for storage in circular buffer <b>124</b>. As indicated above, one or more reader modules <b>126</b> (herein labeled as <b>126</b><sub>1</sub>, <b>126</b><sub>2 </sub>and <b>126</b><sub>3</sub>) are provided to read the streaming information from circular buffer <b>124</b> for rendering. Writer module <b>122</b> stores synchronization information in an index <b>132</b>. Reader modules <b>126</b> may access index <b>132</b> in order to locate a particular portion of the streaming information and properly render the streaming information. Operation of writer module <b>122</b>, circular buffer <b>124</b>, reader modules <b>126</b> and index <b>132</b> are discussed in detail below.
In the embodiment illustrated, two separate playback reader modules <b>126</b><sub>1</sub>, and <b>126</b><sub>2 </sub>are illustrated having outputs that provide streaming information to separate video, audio and data decoders <b>120</b> and rendering devices <b>116</b>. In general, this illustrates that separate reader modules <b>126</b> can be reading streaming information from circular buffer <b>124</b> at different points in circular buffer <b>124</b>, and thus, represents separate individuals accessing the data stored therein. In addition, other reader modules <b>126</b>, such as indicated at <b>136</b>, can be implemented to archive and store the streaming information in circular buffer <b>124</b> for later viewing. Generally, in archiving system <b>136</b>, reader module <b>1263</b> provides streaming information to a mux formatter <b>138</b> that, in turn, provides the information to a writer module <b>140</b> for storage in any of the storage devices indicated above such as hard disk <b>27</b>.
Circular Buffer
Referring back to circular buffer <b>124</b>, circular buffer <b>124</b> has “floating” beginning and ending points, which are referred to as a logical “head” <b>150</b> and “tail” <b>152</b>. Head <b>150</b> corresponds to the logical head of valid data in circular buffer <b>124</b>, and tail <b>152</b> corresponds to the logical tail of valid data in circular buffer <b>124</b>. Writer module <b>122</b> always writes to the head of buffer <b>124</b>, which moves circularly through the buffer in the direction of arrow <b>154</b>. Buffer <b>124</b> therefore always has a fixed maximum time quantum of data available for reading. For example, when time shifting multimedia (e.g., audio and video) content, writer module <b>122</b> receives the streaming multimedia information and stores the information in circular buffer <b>124</b>. The user views the stored multimedia content through one of the readers modules <b>126</b>. The circular structure of buffer <b>124</b> allows some portion of the streaming information to be available for the user to “instant replay” or “pause” on demand, for example, without allowing the buffer to “fill-up” with “time-shifted” data. Circular buffer <b>124</b> can be implemented in volatile or non-volatile memory, such as random access memory (RAM), a hard disk, a floppy disk or an optical disk. In one embodiment, circular buffer <b>124</b> is implemented in hard disk drive <b>27</b>.
<figref idref="DRAWINGS">FIG. 7</figref> is a block diagram of delay filter <b>112</b> showing an interface to circular buffer <b>124</b>. Buffer IO layer <b>200</b> interfaces between circular buffer <b>124</b> and the clients of the buffer, which include writer module <b>122</b> and reader modules <b>126</b> (labeled <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>, where N is an integer variable greater than or equal to 1). Buffer IO layer <b>200</b> implements the circularity of buffer <b>124</b> and synchronizes writer module <b>122</b> with reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>Buffer IO layer <b>200</b> implements circularity by translating between logical addresses, used at upper interfaces <b>204</b>-<b>207</b> to identify logical positions within buffer <b>124</b>, and physical (wrap around) addresses, used at lower interface <b>208</b> for identifying particular physical addresses within buffer <b>124</b>. The logical addresses always increase (or decrease) with time and never wrap around. The logical addresses can be periodically reset as desired. The physical addresses wrap around (i.e. wrap from the highest address of the buffer to the lowest address of the buffer) at a frequency determined by the circular buffer size. As each successive block of the streaming information is received by writer module <b>122</b>, the block is associated with a respective logical address or a range of logical addresses, which increases with each successive block. Buffer IO layer <b>200</b> translates the logical addresses into corresponding physical addresses which are used to access circular buffer <b>124</b>. In one embodiment, buffer IO layer <b>200</b> translates the logical addresses into physical addresses as a function of the logical address modulo the buffer size (i.e. the number of storage locations in circular buffer <b>124</b>). Buffer layer IO <b>200</b> can be implemented in an operating system, for example.
Write/Read Synchronization
Since writer module <b>122</b> and reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>can operate independently of one another and at different data rates, buffer IO layer synchronizes writer module <b>122</b> and reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>to maintain a predetermined temporal order between writing and reading. In one embodiment, buffer IO layer <b>200</b> prevents any reader <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>from reading data that is not yet logically available and prevents writer module <b>122</b> from overwriting data that is in the process of being read by one or more of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>In circular buffer <b>124</b>, a given physical position corresponds to multiple logical positions. Without synchronization, a reader module that is trailing writer module <b>122</b> by a distance that is close to the buffer size may be reading from the same physical area to which writer module <b>122</b> is writing. Buffer IO layer <b>200</b> also allows reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>to follow writer module <b>122</b> as close as possible to minimize latency.
Buffer IO layer <b>200</b> implements a synchronization algorithm for writer module <b>122</b> and reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>. Each time writer module <b>122</b> wants to pass data to buffer IO layer <b>200</b>, its corresponding application calls the synchronization algorithm. Similarly, each time one of the reader modules <b>126</b><sub>1</sub><b>126</b><sub>N </sub>wants to read data from buffer IO layer <b>200</b>, its corresponding application calls the synchronization algorithm. The synchronization algorithm can be implemented in hardware, software, or a combination of both, as desired.
The synchronization algorithm uses “blocking” to (1) block a reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>that is trying to read data which has not yet been written and/or (2) block writer module <b>122</b> if it is trying to write to an area of circular buffer <b>124</b> from which one of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is currently reading. In both cases, one component is blocked until another component has completed the operation necessary to remove the offending condition. For example, if writer module <b>122</b> is blocked, it remains blocked until all of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>, which who are reading from the area to be written, have completed their reads. When a reader module is blocked, it remains blocked until writer module <b>122</b> has written all of the data requested by that reader module.
The synchronization algorithm uses a plurality of shared variables. Each client has its own set of variables which are shared with the other clients. In <figref idref="DRAWINGS">FIG. 8</figref>, circular buffer <b>124</b> is arranged along a linear time line from zero to infinity. The synchronization algorithm maintains a “Tail Pointer” <b>230</b> which is an integer variable indicating the logical tail of valid data in circular buffer <b>124</b>. A “Head Pointer” <b>232</b> is an integer variable which indicates the logical head of valid data in circular buffer <b>124</b>. For a read operation to succeed, the logical read position within circular buffer <b>124</b> must be greater than or equal to Tail Pointer <b>230</b> and less than or equal to Head Pointer <b>232</b>. Since buffer <b>124</b> is circular, the logical position of Tail pointer <b>230</b> is also logically “ahead” of the logical position of Head Pointer <b>232</b>.
When writer module <b>122</b> issues a write command, it specifies an area in buffer <b>124</b> to be written, starting at a present write position <b>234</b>. A “Writer Blocked On” integer variable <b>236</b> is used to identify the logical position corresponding to the end of the data to be written when all or part of the area to be written is blocked by one or more of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>. The Writer Blocked On variable is set when one of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is currently reading from that area. For example, a reader module may be presently reading from logical position <b>235</b>, which is in the area between positions <b>234</b> and <b>236</b>. A “zero” value for the “Writer Blocked On” variable indicates that writer module <b>122</b> is not currently blocked by any of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>.
A “Currently Reading From” integer variable is maintained for each reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>. The Currently Reading From variable is used to indicate that the reader module is currently performing a read that starts at this logical position in circular buffer <b>124</b>. For example, in <figref idref="DRAWINGS">FIG. 8</figref>, a reader module is currently reading from logical position <b>235</b> in circular buffer <b>124</b>. The Currently Reading From variable is used to prevent writer module <b>122</b> from overwriting the data in logical position <b>235</b> while the reader module is reading from logical position <b>235</b>. When a particular reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is not currently reading from circular buffer <b>124</b>, its corresponding Currently Reading From variable is set to infinity.
A “Writer Unblocked Event” variable is used to “wake-up” writer module <b>122</b> when it can proceed with its desired write command. For example, the Writer Unblock Event variable is set to an active state when writer module <b>122</b> is not blocked, and is reset to an inactive state when writer module <b>122</b> is blocked. The Writer Unblock Event can be implemented as a Windows® event (a “Win32” event) or any other similar synchronization mechanism familiar to those skilled in the art.
A “Reader Unblock Event” variable is used for each reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>for “waking-up” the reader module when the data it is requesting is available. For example, the Reader Unblock Event variable is set to an active state when the corresponding reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is not blocked and is reset to an inactive state when the corresponding reader module <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is blocked.
A “Critical Section” variable is used to protect access to each of the above shared variables. For example, a “Win32” Critical Section may be used or any other similar synchronization mechanism such as a mutual exclusion “mutex” object, as is known to those skilled in the art.
<figref idref="DRAWINGS">FIGS. 9A</figref>, <b>9</b>B, <b>11</b>A and <b>11</b>B together form a flow chart for the synchronization algorithm according to one example of the present invention. The steps performed during a write are shown in <figref idref="DRAWINGS">FIG. 9A</figref> and are labeled <b>300</b>-<b>317</b>. At step <b>300</b>, when the application driving writer module <b>122</b> wishes to pass data to Buffer IO layer <b>200</b>, the application calls algorithm <b>290</b>. At step <b>301</b>, algorithm <b>290</b> locks the Critical Section to protect access to the variables used in steps <b>302</b>-<b>305</b>. At step <b>302</b>, algorithm <b>290</b> advances the “Tail Pointer” to the logical position in circular buffer <b>124</b> that corresponds to the end of the write command. This logical position will depend upon the amount of data being written by writer module <b>122</b>. The length of data can vary from one write command or data block to the next, and the data can have arbitrary data formats, which can also vary from one write command or data block to the next.
<figref idref="DRAWINGS">FIG. 10</figref> is a diagram illustrating advancement of the Tail Pointer in circular buffer <b>124</b>. Tail Pointer <b>250</b> is advanced from logical position <b>260</b> to logical position <b>262</b>. Advancing Tail Pointer <b>250</b> immediately invalidates the area to be written (behind the advanced Tail Pointer <b>250</b>) for future reads, even if writer module <b>122</b> must wait before it can actually start writing the data. As a result, once writer module <b>122</b> notifies buffer IO layer <b>200</b> that it wants to write to an area in circular buffer <b>124</b> by calling the writer algorithm, no new reader modules can start reading from that area. This minimizes the time during which writer module <b>122</b> must wait for reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>and prevents the writer from being perpetually blocked.
Referring back to <figref idref="DRAWINGS">FIG. 9A</figref>, synchronization algorithm <b>290</b> determines whether any of the “Currently Reading From” variables of readers <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is less than (i.e. behind) the “Tail Pointer” variable, at step <b>303</b>. For example, in <figref idref="DRAWINGS">FIG. 10</figref>, a reader module may have a Currently Reading From variable <b>270</b> which is pointing to a logical position <b>272</b> in circular buffer <b>124</b> that is less than the logical position <b>262</b> of the advanced Tail Pointer <b>250</b>. If this is the case, synchronization algorithm <b>290</b> blocks or delays writer module <b>122</b> so that the conflicting reader module can “get out of the way”. If none of the reader modules' “Currently reading From variable is less than the advanced Tail Pointer variable, then synchronization algorithm <b>290</b> proceeds directly to step <b>311</b> (shown in <figref idref="DRAWINGS">FIG. 9B</figref>) to write the data to circular buffer <b>124</b>.
At step <b>304</b>, algorithm <b>290</b> sets the “Writer Blocked On” variable to the value of the “Tail Pointer” variable <b>250</b>. This indicates the largest logical position in circular buffer <b>124</b> at which the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>must be clear of before writer module <b>122</b> can write the data. Algorithm <b>290</b> then blocks writer module <b>122</b> by resetting the “Writer Unblock” event to the inactive state, at step <b>305</b>. Since writer module <b>122</b> is blocked, the Critical Sections are unlocked at step <b>306</b>. At step <b>307</b>, algorithm <b>290</b> waits for the “Writer Unblock” event variable to be activated by the synchronization algorithm for the conflicting reader that is accessing the area to be written. When the conflicting reader module activates the “Writer Unblock” event, algorithm <b>290</b> locks the Critical Section at step <b>308</b> and then resets the “Writer Blocked On” variable to zero, at step <b>309</b>. Algorithm <b>290</b> again unlocks the Critical Section at step <b>310</b> and proceeds to step <b>311</b> (shown in <figref idref="DRAWINGS">FIG. 9B</figref>).
At step <b>311</b>, buffer IO layer <b>200</b> converts the starting logical address to a circular or physical address and writes the data in circular buffer <b>124</b>, beginning at that physical address. Once the data has been written, algorithm <b>290</b> locks the Critical Section for the variables used in steps <b>313</b>-<b>315</b> and advances the “Head Pointer” variable to the logical position in circular buffer <b>124</b> that corresponds to the end of the data written by writer module <b>122</b>. In the example shown in <figref idref="DRAWINGS">FIG. 10</figref>, Head Pointer <b>274</b> is advanced from position <b>276</b> to position <b>278</b> (which can also be viewed as being “behind” the advanced Tail Pointer <b>250</b>). Advancing Head Pointer <b>274</b> validates the newly written data between Head Pointer <b>274</b> and Tail Pointer <b>250</b>.
At step <b>314</b>, algorithm <b>290</b> determines whether any of the “Reader Blocked On” variables for reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>is less than the advanced “Head Pointer” variable <b>274</b>. If not, none of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>were waiting for the data written by writer module <b>122</b>, and algorithm <b>290</b> proceeds to step <b>316</b>. If so, one or more of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>were waiting for writer module <b>122</b>, which has now validated the desired logical positions. Algorithm <b>290</b> sets any such “Reader Unblock” event variables at step <b>315</b> to unblock the corresponding reader module.
In the example shown in <figref idref="DRAWINGS">FIG. 10</figref>, a reader module may be waiting to read data at logical position <b>280</b> which was not yet available when Head Pointer <b>274</b> was pointing to logical position <b>276</b>. That reader module would have had a “Reader Blocked On” variable pointing to logical position <b>280</b>, as shown by arrow <b>282</b>. Now that “Head Pointer” variable <b>274</b> is pointing to logical position <b>278</b>, which is ahead of logical position <b>280</b>, the data in position <b>280</b> is available for reading, and algorithm <b>290</b> sets the “Reader Unblock” event variable for that reader module to the active state, thereby unblocking the reader module.
Referring back to <figref idref="DRAWINGS">FIG. 9B</figref>, the corresponding Critical Sections are unlocked at step <b>316</b>, and the algorithm completes at step <b>317</b>.
<figref idref="DRAWINGS">FIGS. 11A and 11B</figref> together illustrate a read portion of synchronization algorithm <b>290</b>, which includes steps <b>351</b>-<b>372</b>. When one of the reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>desires to read data from circular buffer <b>124</b>, that reader module calls algorithm <b>290</b> in buffer IO layer <b>200</b>, at step <b>351</b>. At step <b>352</b>, algorithm <b>290</b> locks the Critical Section to protect the variables used in steps <b>353</b>-<b>355</b>. At step <b>353</b>, algorithm <b>290</b> determines whether the amount of data to be read extends to a logical position in circular buffer <b>124</b> which is beyond the logical position of the “Head Pointer” such that a portion of the desired data is not yet valid. If not, algorithm <b>290</b> proceeds directly to step <b>360</b>.
<figref idref="DRAWINGS">FIG. 12</figref> is a diagram illustrating an example of circular buffer <b>124</b> when the requested data extends beyond the Head Pointer. Circular buffer <b>124</b> has a Tail Pointer <b>330</b> at a logical position <b>332</b> and a Head Pointer <b>334</b> at a logical position <b>336</b>. If the reader module requests data beginning at logical position <b>337</b> and extending up to logical position <b>338</b>, which is beyond the logical position <b>336</b> of Head Pointer <b>334</b>, then algorithm <b>350</b> sets the “Reader Is Blocked On” variable for that reader module to the logical position corresponding to the end of the requested read data (e.g. logical position <b>338</b>), as shown by arrow <b>340</b>. Referring back to <figref idref="DRAWINGS">FIG. 11A</figref>, algorithm <b>350</b> resets the “Reader Unblock” event variable to block the corresponding reader module at step <b>355</b>. Since the reader module is blocked, algorithm <b>350</b> unlocks the corresponding Critical Section, at step <b>356</b>. At step <b>357</b>, algorithm <b>350</b> waits for the “Reader Unblock” variable to be set for this reader (at step <b>315</b> in <figref idref="DRAWINGS">FIG. 9B</figref>). Once the “Reader Unblock” variable is set, the corresponding reader module is unblocked and the Critical Section is locked at step <b>358</b>. The “Reader Blocked On” variable for that reader is then reset to infinity, at step <b>359</b>, and algorithm <b>350</b> proceeds to step <b>360</b>.
At step <b>360</b>, algorithm <b>350</b> determines whether the logical position corresponding to the beginning of the requested data is before the logical position of the “Tail Pointer” variable. If so, the requested data is invalid since it has already been overwritten by writer module <b>122</b>. In this case, algorithm <b>350</b> unlocks the Critical Section at step <b>361</b> and fails the requested read operation at step <b>362</b>. The failure can be passed to the corresponding reader module through a variety of mechanisms, such as a status variable.
If the requested data starts at a logical position that is not before the “Tail Pointer” variable, algorithm <b>350</b> proceeds to step <b>363</b> (shown in <figref idref="DRAWINGS">FIG. 11B</figref>). At step <b>363</b>, algorithm <b>350</b> sets the “Currently Reading From” variable of the reader to the logical position at the start of the requested data. The Critical Section is unlocked at step <b>364</b>, and the starting logical address is converted to a circular or physical address for circular buffer <b>124</b> (shown in <figref idref="DRAWINGS">FIG. 7</figref>). At step <b>365</b>, buffer IO layer <b>200</b> reads the requested amount of data, beginning at the converted logical address and provides the data to the corresponding reader module, at step <b>365</b>. At step <b>366</b>, algorithm <b>350</b> locks the Critical Section. At step <b>367</b>, the “Currently Reading From” variable for the reader is reset to infinity since the read operation has completed.
At step <b>368</b>, algorithm <b>350</b> determines whether the “Writer Blocked On” variable points to a logical position in circular buffer <b>124</b> that is greater than the read position. The read position is the logical position in circular buffer <b>124</b> corresponding to the beginning of the data to be read. If the “Writer Blocked On” variable is not greater than this logical position, then this reader module was not blocking writing module <b>122</b>. Algorithm <b>350</b> then unlocks the Critical Section at step <b>369</b> and completes its function at step <b>370</b>.
If the “Writer Blocked On” variable is greater than this position, then this reader module was blocking writing module <b>122</b>, and algorithm <b>350</b> proceeds to step <b>371</b> to determine whether any other reader module is blocking writer module <b>122</b>. If not, algorithm <b>350</b> sets the “Writer Unblock” event variable to unblock writer module <b>122</b>, at step <b>372</b>. If there are other reader modules that are blocking writer module <b>122</b>, then algorithm <b>350</b> proceeds to step <b>369</b> without setting the “Writer Unblock” event variable.
The algorithm shown in <figref idref="DRAWINGS">FIGS. 9 and 11</figref> can be modified in a variety of ways in alternative embodiments. For example, it may not be desirable to block writer module <b>122</b>. If the streaming information being provided to writer module <b>122</b> may be lost if writer module <b>122</b> is delayed by any significant period of time, such as when writer module <b>122</b> is coupled to a television tuner, then it would not be desirable to delay writer module <b>122</b>. In these embodiments, algorithm <b>290</b> is modified in <figref idref="DRAWINGS">FIGS. 9A and 9B</figref> to remove steps <b>303</b>-<b>310</b> which serve to delay writer module <b>122</b>. Algorithm <b>290</b> proceeds from step <b>302</b> directly to step <b>311</b>. Similarly, algorithm <b>290</b> is modified in <figref idref="DRAWINGS">FIGS. 11A and 11B</figref> to remove steps <b>366</b>-<b>369</b>, <b>371</b> and <b>372</b> which serve to selectively unblock writer module <b>122</b>.
In addition, algorithm <b>290</b> can be modified to perform steps <b>360</b>-<b>362</b> (validating the read operation) either before or after the read is performed at step <b>365</b>, or both. Validating the read operation before the actual read operation avoids a wasteful read. However, steps <b>360</b>-<b>362</b> can be performed after step <b>366</b> if desired. Steps <b>360</b>-<b>362</b> can also be performed both before and after read step <b>365</b>.
The synchronization algorithm shown in <figref idref="DRAWINGS">FIGS. 9 and 11</figref> does not require a circular buffer such as that shown in <figref idref="DRAWINGS">FIG. 6</figref>. The synchronization algorithm can also be used with minor modification in a linear buffer having both logical and physical addresses that wrap around at a frequency based on the size of the buffer. However, a circular buffer allows a reader module to be time-shifted with respect to the writer module such that a portion of the streaming information is available to the user for “instant replay” on demand. A circular buffer allows the user to pause a program, but does not allow the user to inadvertently fill up the buffer with time shifted data. The writer module is always writing to the “beginning” of the buffer, which is point that moves circularly through the buffer.
The synchronization algorithm shown in <figref idref="DRAWINGS">FIGS. 9 and 11</figref> also allows the user to fast forward through the data stored in the buffer. If the user has paused a reader module so that the writer module is considerably ahead of that reader, the user or the application has the option of fast-forwarding the reader module to catch up to the writer module. However, the synchronization algorithm stops fast-forwarding when the reader module catches up with the writer module. For example, the reader module may initiate a “DirectShow” event (or other appropriate event mechanism available to the software environment) whenever the reader module is blocked by the writer module. The application detects this event, and switches the state of the reader module from fast-forward to normal play mode. If the writer module catches up to the reader module, corruption by the writer module can be avoided by (1) blocking the reader until the data is available, (2) blocking the writer until the reader is out of the way, or (3) moving the reader ahead by unpausing or fast forwarding the reader.
User Operation Permission Checking
In one embodiment, delay filter <b>112</b> (shown in <figref idref="DRAWINGS">FIG. 6</figref>) further includes a user operation permission checking and reporting mechanism which maintains consistent operating states in the filter. <figref idref="DRAWINGS">FIG. 13</figref> is a diagram illustrating a status register <b>420</b> which is maintained by delay filter <b>112</b> for each data stream, or channel, through the filter. Delay filter <b>112</b> can maintain register <b>420</b> in RAM, for example, or any other storage medium. Status register <b>420</b> includes a plurality of fields, with each field having one or more bits. In the example shown in <figref idref="DRAWINGS">FIG. 13</figref>, bits <b>0</b>-<b>10</b> of status register <b>420</b> correspond to user operation fields UOP<b>1</b>-UOP<b>10</b>, respectively. Bits <b>11</b>-<b>27</b> correspond to reserved fields. Bits <b>28</b>-<b>31</b> correspond to a channel streamer ID field which identifies the particular data stream through writer module <b>122</b> and reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N </sub>to which status register <b>420</b> is associated. Each user operation field UOP<b>0</b>-UOP<b>10</b> has a binary value which indicates whether the corresponding user operation is permitted or prohibited. For example, a binary “one” in the corresponding field would indicate that that user operation is permitted. A binary “zero” in a user operation field would indicate that that user operation is prohibited. <figref idref="DRAWINGS">FIG. 14</figref> is a table listing examples of user operations that correspond to user operation fields UOP<b>0</b>-UOP<b>10</b>. Delay filter <b>112</b> maintains the UOP fields for each stream or channel based on the state of its reader module. Delay filter <b>112</b> updates the user operation bits whenever the state of the reader module changes.
Certain user operations might be permitted only in certain states of the delay filter. Use of a prohibited operation might lead to inconsistent states in the delay filter and user interface. For example, assume that a reader module that is performing “time-shifting” of multimedia content is paused at point X in the circular buffer <b>124</b>. In the meantime, writer module <b>122</b> is still writing data into circular buffer <b>124</b>. Depending on the size of the circular buffer <b>124</b> and the time for which the reader module has been paused, there is a possibility that writer module <b>122</b> can catch up to the point X where the reader module is paused and try to overwrite the data. In this case, delay filter <b>112</b> can forcibly “unpause” the reader module and send a notification to the application that the paused reader module has been unpaused. There is a small time window between the time at which the reader is “unpaused” and the time at which the application receives the notification. During this time window, the application might issue a prohibited user command, such as a forward scan. The reader module will now be performing the forward scan at the time the application receives the notification that the reader module has been unpaused and is playing at normal speed. The application and the delay filter <b>112</b> are therefore in inconsistent states.
To avoid this problem, delay filter <b>112</b> allows the application to check the user operation bits whenever a user operation is issued to check for validity of the operation. Also, whenever the user operation bits change, delay filter <b>112</b> reports this change to the application. The application can therefore update its user interface to ensure that invalid user operations are not issued to the delay filter <b>112</b>.
<figref idref="DRAWINGS">FIG. 15</figref> is a flow chart of a software module or object that can be called by the application through an application program interface (“API”), for example, whenever the user requests an operation or the user operation status bits change. At step <b>430</b>, the application waits for the user to request an operation. Once a user operation has been requested, the application checks the status of the corresponding user operation bit, at step <b>431</b>. If the operation is permitted at step <b>432</b>, the application issues the requested operation to delay filter <b>112</b>, at step <b>433</b>. If the requested operation is prohibited, the operation is rejected at step <b>434</b>.
<figref idref="DRAWINGS">FIG. 16</figref> is a flow chart illustrating steps performed by delay filter <b>112</b> in maintaining the user operation bits for each status register. At step <b>440</b>, delay filter detects a change in the state of one of the reader modules. At step <b>441</b>, the user operation bits of the status register for the corresponding stream or channel are updated as a function of the change in state. Delay filter <b>112</b> then notifies the application through an API, for example, for that stream or channel of the change in state, at step <b>442</b>. The application can then update the user interface to disable or enable selected subsets of the user operations listed in <figref idref="DRAWINGS">FIG. 14</figref>. A user interface update can include setting or resetting light indicators, issuance of an audible alert or changing screen displays, for example. The application can determine whether the user interface should be updated by querying the delay filter <b>112</b> for the user operation bits for a specific stream or channel.
Time Shifting
Another broad inventive aspect illustrated by the exemplary embodiment includes the concept of “time shifting” when streaming information is rendered. Generally, an information appliance for receiving streaming information implements time shifting by including a buffer (in a one embodiment circular buffer <b>124</b>), writer module <b>122</b> which receives blocks of streaming information and writes blocks to the buffer, and at least one reader module <b>126</b> which selectively reads the blocks from the buffer.
Although all signal processing equipment inherently includes signal propagation delay, “time shifting,” as used herein, is distinguishable for the reasons discussed below separately or in any combination. In the first instance, the amount of time shifting (i.e., the relative position of any one reader module <b>126</b> with respect to the writer module <b>122</b> in circular buffer <b>124</b>) is selective and adjustable. In a first mode of operation, the user can “rewind”, “pause”, “fast forward” and “play” in any desired order, thereby changing the relative reading position of an associated reader module <b>126</b> with respect to a position of writer module <b>122</b> in circular buffer <b>124</b>. Hence, rendered streaming information (which begins with a reader module <b>126</b>) is delayed in time from the streaming information that is written by writer module <b>122</b>.
In another mode of operation, logic is provided to adjust the amount of “time shifting” based upon operation of the system and without user intervention. For instance, if a reader module has been “paused” by a user, thus maintaining the current position of reader module <b>126</b> in circular buffer <b>124</b>, at some time it may be necessary to begin advancing the reader position in order that writer module <b>122</b> can store new streaming information in circular buffer <b>124</b>. This situation may require reader module <b>126</b> to begin moving forward within circular buffer <b>124</b> at a rate greater than or at least equal to the rate at which streaming information is being written to circular buffer <b>124</b>.
Automatic adjustment of the position of a reader module <b>126</b> in circular buffer <b>124</b> can also be initiated by user commands not directly associated with movement of a position of reader module <b>122</b>, such as “play”, “pause”, “rewind” and “fast forward”. As probably best illustrated by example, the source of streaming information <b>114</b> to delay filter <b>112</b> can be a multiple broadcast channel device such as a television tuner, or the like. If the user begins rendering information pursuant to a selected broadcast channel, pauses, and then again resumes rendering information on the same broadcast channel, the associated position of reader module <b>126</b> will change position accordingly, thereby increasing the relative distance of the position of reader module <b>126</b> and the position of writer module <b>122</b> in circular buffer <b>124</b>. If the user then selects a different broadcast channel to be rendered, for example, a different television channel, writer module <b>122</b> will then record the streaming information associated with the new broadcast channel in circular buffer <b>124</b>. However, since the position of reader module <b>126</b> is “time shifted” from the position of writer module <b>122</b> by a delay in proportion to the amount of time the user had paused, the user will not notice the new broadcast channel selection until reader module <b>126</b> reaches the new streaming information in circular buffer <b>124</b> provided by the change in broadcast channel. In order to obviate the problems presented by the foregoing, the position of reader module <b>126</b> is automatically advanced to a position in circular buffer <b>124</b> adjacent the position of writer module <b>122</b>. This technique reduces the amount of delay so that rendered streaming information substantially follows broadcast channel selection in a multiple broadcast channel environment.
Another distinguishing feature between “time shifting” as used herein and typical signal propagation delay is the medium used to record streaming information. In particular, as discussed above, circular buffer <b>124</b> can be embodied using any of the storage devices described above such as RAM memory, hard disk <b>27</b>, or the like. In addition, the amount of memory present in circular buffer <b>124</b> is sufficient to provide a perceptible delay to the user, if desired. In one embodiment, the extent of circular buffer <b>124</b> provides at least five minutes of delay between writing and rendering of streaming information. In a further embodiment, the extent of circular buffer <b>124</b> is sufficient to provide at least 30 minutes of delay between writing and rendering streaming information. In yet a further embodiment, the extent of circular buffer <b>124</b> is sufficient to provide at least one hour of delay.
A further distinguishing feature of “time shifting” as used herein includes the presence of a single writer module <b>122</b> and a plurality of independent reader modules <b>126</b><sub>1</sub>-<b>126</b><sub>N</sub>.
In one embodiment, any information received from streaming source <b>114</b> is first recorded in circular buffer <b>124</b> prior to rendering the streaming information to the user. In other words, all information to be rendered to the user is read with an associated reader module <b>126</b> from circular buffer <b>124</b>, wherein there exists no direct connection from streaming source <b>114</b> to rendering devices <b>116</b>. Although recording and reading from circular buffer <b>124</b> prior to rendering streaming information, may slightly increase propagation delay when the position of reader module <b>126</b> in circular buffer <b>124</b> is substantially adjacent to the position of writer module <b>122</b>, advantages of always writing to and reading from circular buffer <b>124</b> include simplification in system design and operation, which enhances system stability. Although a switching mechanism could be provided in the system to switch from substantially “live” streaming information and time shifted streaming information as provided by delay filter <b>112</b>, the switching mechanism whether software, hardware or a combination thereof, nevertheless necessitates another component in this system that must be designed and tested to operate with the remaining components of the system. Furthermore, by eliminating a direct connection of the source of streaming information <b>114</b> and the rendering devices <b>116</b> and always reading from circular buffer <b>124</b> prior to rendering, the quality of rendered information is consistent. In other words, there is no change in quality (e.g., video quality or audio quality) of rendered streaming information since all information must pass through the same system components. Furthermore, by always writing to and reading from circular buffer <b>124</b>, the user need not remember to execute a particular command so that streaming information is recorded, for example, in order to provide “instant replay.” In this manner, the user is also able to retrieve and save an entire segment of streaming information (such as a television show) even when the user has already rendered some of the streaming information. Thus, if the user is viewing a show and then later decides to save the show, he can invoke archive system <b>136</b> to begin at the start of the show in circular buffer <b>124</b> and transfer a copy of the streaming information to a more permanent file. The latter can be performed while still viewing the show with a separate reader module <b>126</b>. However, the user must initiate saving or archiving prior to writer module <b>122</b> writing over any of the desired streaming information, but in a preferred embodiment, circular buffer <b>124</b> is of sufficient length to provide many minutes if not hours of stored information.
Data Block Structure
<figref idref="DRAWINGS">FIG. 17</figref> is a pictorial representation of a block <b>500</b> of data stored in circular buffer <b>124</b> for one stream of a multi-stream source of streaming information. Generally, data block <b>500</b> includes a header portion <b>502</b>, a data or payload portion <b>504</b> and a tail or end portion <b>506</b>. Header portion <b>502</b> contains relevant information as to the size of the data block and the channel to which it pertains. In particular, header portion <b>502</b> includes a field <b>508</b> in which the size of the entire block, including this field, is stored. Field <b>509</b> contains information used to identify the streaming information to which the data block pertains. Field <b>510</b> provides a distance (typically bytes) from the beginning of the data block to where the actual streaming information or payload is stored in data block <b>500</b>. Field <b>511</b> provides a value indicating the size of the actual data or payload <b>504</b>. In one embodiment, each of fields <b>508</b>-<b>511</b> are of fixed length in order that their location in data block <b>500</b> is known.
In one embodiment, a field <b>512</b> is also provided in header portion <b>502</b>. Field <b>512</b> provides other information relevant to the streaming information. As used herein, field <b>512</b> is referred to as “prefix field” in view of its relation to the actual data or payload <b>502</b>. In a one embodiment, prefix field <b>512</b> is of variable length, thus the information need not be length restricted. If desired, a field <b>513</b> is also provided, indicating the size of the prefix field <b>512</b>. Typically, field <b>513</b> is also of fixed length, like fields <b>508</b>-<b>511</b>.
Prefix field <b>512</b> can be used to store information such as synchronization indicators, discussed below, a pointer to the next data block pertaining to the same stream, or other information as may be desired. As appreciate by those skilled in the art, a format is specified for information to be contained in prefix field <b>512</b> in order that relevant information can be decoded easily. However, since prefix field <b>512</b> can be of any length, additional information can be stored as necessary, thereby making data block <b>500</b> extensible.
It should also be noted that prefix field <b>512</b> can also include a selected amount of “fill” data. The fill data is used to adjust or increase the size of data block <b>500</b> to a predetermined length, which may be desirable for processing or storage in circular buffer <b>124</b>.
Data or payload field <b>504</b> stores digital data received from the source of streaming information <b>114</b>, which will be rendered.
In the embodiment illustrated, tail or end portion <b>506</b> includes two fields <b>520</b> and <b>521</b>. Field <b>520</b>, herein also referred to as “suffix field” is similar to prefix field <b>512</b> in that it can be used to store information about data blocks that are successive or preceding in the same stream. In one embodiment, suffix field <b>520</b> is at a known location from the end of data block <b>500</b> and stores a pointer indicating the location of the preceding data block corresponding to the same channel. This information is particularly useful when it may be necessary to perform a “rewind” operation upon the streaming information contained in circular buffer <b>124</b>. Suffix field <b>520</b> can also include other information present in the data block <b>500</b> such as data associated with field <b>511</b> and field <b>513</b>. In a manner similar to prefix field <b>512</b>, a format for the information contained in suffix field <b>520</b> is predetermined and known to the reader module in order that relevant information can be obtained therefrom. Suffix field <b>520</b> can be of fixed length, or can be of variable length, wherein it may be desired to provide an additional field similar to field <b>513</b> that indicates the length of suffix field <b>520</b>. Suffix field <b>520</b> can also be used to store “fill data”, if desired.
Field <b>521</b> provides the size of data block <b>500</b> and, as such, is identical to field <b>508</b> in header portion <b>502</b>. Field <b>521</b> is useful when a reader module progresses backward through the circular buffer <b>124</b>. In this manner, the reader module can ascertain the size of a data block <b>500</b> by reading the value contained in field <b>521</b>, at which point, the reader module has determined where the end of the preceding block is located. Without the presence of field <b>521</b>, the reader module would otherwise have to scan the data block <b>500</b> in order to determine its size or beginning location, which can consume processing time.
<figref idref="DRAWINGS">FIG. 18</figref> illustrates a sequence of data blocks <b>530</b> from a multi-stream streaming information source. In particular, data blocks <b>532</b>A, <b>532</b>B and <b>532</b>A comprise a portion of a first stream; data blocks <b>534</b>A and <b>534</b>B comprise a portion of a second stream; and data blocks <b>536</b>A and <b>536</b>B comprise a portion of a third stream. The data blocks <b>532</b>A-<b>532</b>C, <b>534</b>A-<b>534</b>B and <b>536</b>A-<b>536</b>B together comprise a single channel and (e.g., audio, video and data) are generally interposed such as illustrated in <figref idref="DRAWINGS">FIG. 18</figref>; however, there is generally no requirement that a specific order be followed.
As indicated above, prefix fields <b>512</b> and suffix fields <b>520</b> can be used to store pointers indicating preceding and succeeding data blocks in each of the stream streams. In the illustration of <figref idref="DRAWINGS">FIG. 18</figref>, arrows <b>534</b> represent that prefix fields <b>512</b> of data blocks <b>530</b> store pointers or addresses of the immediate succeeding data block in each of the stream, respectively. Similarly, arrows <b>536</b> represent that suffix fields <b>320</b> of each of data blocks stores pointers or addresses of the immediate preceding data block in each stream, respectively. In one embodiment, each of the prefix fields <b>512</b> stores the address of the prefix field <b>512</b> in the immediate succeeding data block, while each of the suffix fields <b>520</b> stores the address of the suffix field <b>520</b> in the immediate preceding data block. In this manner, reader module <b>126</b> can quickly locate and process data blocks for a particular stream of streaming information.
<figref idref="DRAWINGS">FIG. 19</figref> illustrates a second sequence of data blocks <b>550</b>. In sequence <b>550</b>, data blocks <b>552</b>, <b>554</b> and <b>556</b> pertain to streaming information received from streaming information source <b>114</b>, which will be selectively rendered by rendering devices <b>116</b> in the manner discussed above and further below. However, sequence <b>550</b> further includes data blocks <b>558</b> and <b>560</b> that “pad” the sequence <b>550</b> and do not contain any streaming information to be rendered. Rather, data blocks <b>558</b> and <b>560</b> are used, if desired, to organize or structure the sequence <b>550</b> stored in circular buffer <b>124</b>, or other storage device, in a desired manner. For instance, it may be desirable that data blocks stored in circular buffer <b>124</b> coincide with defined medium boundaries partition such as sector or cluster boundaries. In <figref idref="DRAWINGS">FIG. 19</figref>, desired boundaries are indicated at <b>562</b>A and <b>562</b>B. Data blocks <b>552</b>, <b>554</b> and <b>554</b> are organized along with a padding data block <b>560</b> of suitable size or length such that a data block <b>564</b> begins at the boundary <b>562</b>B. If desired, a plurality of padding data blocks can be used, and the order of streaming information data blocks and padding data blocks can be changed to meet any desired criteria. The sequence of <figref idref="DRAWINGS">FIG. 19</figref> is but one exemplary sequence structure.
It should be noted that field <b>509</b> of each data block can be used to identify padding data blocks from other streaming information data blocks wherein writer module <b>122</b> can generate padding data blocks as necessary during processing and formation of streaming information data blocks. Furthermore, padding data blocks can be used in combination with “fill” data provided in prefix field <b>512</b> or suffix field <b>520</b>, if desired. Mux formatter <b>138</b> and writer module <b>140</b> can also implement the use of padding data blocks, and/or fill data contained in prefix field <b>512</b> or suffix field <b>520</b>.
Multiple Readers Per Buffer
It may be desirable, in some instances, to allow a plurality of users to access the streaming information at any one time. This can be accomplished in any number of different ways. For example, the streaming information could be duplicated and one reader module can be provided for each copy of the streaming information. However, this requires a great deal of storage, and may also require increased processing power for making multiple copies of the streaming information and for accessing the duplicate copies. Also, once the predetermined number of copies of the streaming information are in use, it can become very difficult to add new users.
<figref idref="DRAWINGS">FIG. 20</figref> is similar to <figref idref="DRAWINGS">FIG. 6</figref> described above. However, <figref idref="DRAWINGS">FIG. 20</figref> illustrates portions of a system <b>610</b> in more detail and eliminates other portions for clarity. For example, <figref idref="DRAWINGS">FIG. 20</figref> illustrates that system <b>610</b> includes circular buffer <b>124</b>, a plurality of reader modules <b>614</b>, <b>616</b>, <b>618</b> and <b>620</b> (which can be the same as or similar to reader modules <b>126</b> mentioned above) associated with a plurality of users (users <b>630</b>-<b>636</b>, respectively). Similarly, <figref idref="DRAWINGS">FIG. 20</figref> illustrates that each reader module includes an interface <b>622</b>, <b>624</b>, <b>626</b> and <b>628</b>, respectively. Interfaces <b>622</b>-<b>628</b> are described in greater detail below.
In the illustrative embodiment shown in <figref idref="DRAWINGS">FIG. 20</figref>, a plurality of users <b>630</b>, <b>632</b>, <b>634</b> and <b>636</b> are depicted coupled to interfaces <b>622</b>-<b>628</b>, respectively. In the embodiment illustrated, users <b>630</b> and <b>632</b> are viewers, or rendering applications, for viewing or rendering streaming information stored in circular buffer <b>124</b>, while users <b>634</b> and <b>636</b> are data storage sites which are used for archiving the streaming information stored in circular buffer <b>124</b>. <figref idref="DRAWINGS">FIG. 20</figref> also illustrates a separate application program <b>638</b>, separately coupled to interfaces <b>622</b>-<b>628</b>.
Again, it should be noted that <figref idref="DRAWINGS">FIG. 20</figref> is illustrative only, and that any number of users or application programs can be coupled to any number of reader modules. Similarly, the users can be any suitable type of users desirous of accessing the streaming information stored in circular buffer <b>124</b>, and may be accessing the information for reasons other than viewing, or archival purposes, as is depicted in <figref idref="DRAWINGS">FIG. 20</figref>. Similarly, in accordance with this aspect of the present invention, the buffered streaming information need not necessarily be stored in circular buffer <b>124</b>, but can be stored in a linear buffer, or any other type of buffer. However, circular buffer <b>124</b> is illustrated for purposes of simplicity only.
In one illustrative embodiment, reader modules <b>614</b>-<b>620</b> are implemented as objects which conform to the COM object-oriented programming model. Each reader module or “reader object” has independent access to the buffered streaming information. Each reader module <b>614</b>-<b>620</b> is depicted as accessing the streaming information at a different location on circular buffer <b>124</b>. This illustrates that reader modules <b>614</b>-<b>620</b> can access the buffered information at different times in the buffered information stream. This allows the multiple users <b>630</b>-<b>636</b> to independently employ all the features of time shifting mentioned above, without interfering with the other users accessing the buffered information stream. One user, for instance, can archive the streaming information for later viewing, while at the same time another user can view the information.
Similarly, the archival user can store the buffered streaming information from a time or location in the data buffer which is different than the time or location in the data buffer which the viewer is accessing. For instance, the archival user may simply be reading the information, as it is recorded in circular buffer <b>124</b>, and storing it in archival storage. By contrast, the viewer may be viewing the data, but intermittently pausing to take breaks or perform other tasks. Therefore, the reader module associated with the viewer may well be at a temporally displaced location in buffer <b>124</b> than the reader module associated with the archival process.
Thus, <figref idref="DRAWINGS">FIG. 20</figref> illustrates a system by which multiple reader modules can access the buffered streaming information. The system depicted requires only one writer module for buffering the streaming information, and only a single copy of the streaming information. This greatly reduces the amount of storage required, and also reduces the processing power required. Similarly, since the reader modules, in one illustrative implementation, are simply objects configured to access the information in buffer <b>124</b>, virtually any number of objects can be added to the system, limited only by the computational resources of the system. This can be accomplished by simply instantiating another reader object.
Since the streaming information written in circular buffer <b>124</b> can be formed of one or more channels each having a plurality of streams (e.g., audio, video, closed captioning, etc.), the output from each of the reader modules <b>614</b>-<b>620</b> will likely have a plurality of effective output pins, each pin carrying one of the streams of a given channel in the streaming information. Since system <b>610</b> illustrates that a plurality of different reader modules can be used to access the same buffered streaming information, this can present some obstacles which must be overcome.
For example, in some streaming architectures, the need may arise to group the pins associated with each reader module <b>614</b>-<b>620</b> so that the user, application, or whatever other component is receiving the data from the reader module, knows which pins are associated with that reader module. An example of a streaming architecture which can be used in accordance with the present invention is an architecture known as DirectShow services.
DirectShow services is an architecture which is commercially available and well known. However, for a better understanding of certain aspects of the present invention, a brief description of the DirectShow services system may be beneficial.
DirectShow services refers to a modular system of pluggable components known as filters, arranged in a configuration known as a filter graph. A component referred to as a filter graph manager oversees the connection of these filters and controls the flow of the streaming information therethrough. An exemplary filter graph is composed of a collection of filters of different types.
Most filters can be categorized into one of three types:
1. Source filters take data from a source, such as a disk file, camcorders, satellite feed, internet server, or VCR, and introduce that data into the filter graph;
2. Transform filters process data and pass it along to other portions of the filter graph, or out of the filter graph; and
3. Rendering filters render data to a hardware device or to any location that accepts media input (such as memory or a disk file).
In addition to these three types of filters, there are other kinds of filters also. Examples of other filters include effect filters, which add effects without changing the data type, and parser filters, which are configured to understand the format of the source data and know how to read correct bytes, create time stamps, and perform seek operations.
Further, it is quite possible for some filters to represent a combination of filter types, or functions. In the DirectShow architecture, a filter is said to pass streaming information “downstream” to a next subsequent filter. An “upstream filter” refers to the filter which passes data to the downstream filter, and a “downstream filter” refers to the next filter in line to receive the data. In one illustrative embodiment, the filters are program modules written in any language which can generate objects adhering to component object model (COM) programming. Of course, COM programming refers to the object-oriented programming model which defines how objects interact with a single application or between applications. In COM, client software accesses an object through a pointer to an interface (e.g. API) which has a related set of functions, called methods, on the object.
By way of example only, a filter graph <b>640</b>, the purpose of which is to play back MPEG-compressed video information from a file may take the form set out in <figref idref="DRAWINGS">FIG. 20A</figref>. Filter graph <b>640</b> includes source filter <b>642</b>, MPEG parser <b>644</b>, video decompression transform filter <b>646</b>, audio decompression transform filter <b>648</b>, video render filter <b>650</b> and audio render filter <b>652</b>. Source filter <b>642</b> reads data from a disk and provides it as streaming information to MPEG parser <b>644</b>. MPEG parser <b>644</b> parses the streaming information into its audio and video streams. Transform filters <b>646</b> and <b>648</b> decompress the video and audio data in the corresponding streams. Render filters <b>650</b> and <b>652</b> act to display the video data on a screen and send the audio information to a sound card, respectively.
It can thus be seen that, when using certain streaming architectures, such as the DirectShow architecture, it can be important that applications or other programming modules which are to receive streaming information from any of reader modules <b>614</b>-<b>620</b> know which output pins correspond to which of the reader modules. For example, since the streaming information being read by each of the reader modules <b>614</b>-<b>620</b> can include a channel having a plurality of streams, it is important that a user or application program receiving information from any given reader receive all streams associated with that reader, and no other reader. In other words, it would be undesirable for an application program (or a rendering filter, for example) to receive an audio stream from reader module <b>614</b> but a video stream and closed caption stream from reader module <b>616</b>. Reader module <b>616</b> may well be reading the stream information from a different location in buffer <b>124</b> than reader module <b>614</b>. Therefore, the audio and closed captioning streams would not correspond to the video stream.
In order to address this obstacle, one feature of the present invention includes a new COM interface which allows an object outside of reader modules <b>614</b>-<b>620</b> to enumerate the output pins which belong to that particular reader module. In other words, in the embodiment in which reader modules <b>614</b>-<b>620</b> are implemented as objects, those objects are configured to expose methods through associated interfaces <b>622</b>-<b>628</b> to the application (or other external components which have contact with the reader modules) which allow manipulation of the object. One exemplary method exposed by interfaces <b>622</b>-<b>628</b> is referred to as IenumChannelStreamPin, which, when invoked by an outside object, yields a value which represents an enumeration of the particular output pins belonging to the particular reader module which was queried. In this way, an outside object can quickly and easily obtain an enumeration of the particular pins belonging to any of the given reader modules <b>614</b>-<b>620</b>, through its associated interface <b>622</b>-<b>628</b>.
Interfaces <b>622</b>-<b>628</b> also expose another method which allows any specific pin output by any of reader modules <b>614</b>-<b>620</b> to be queried for its group's enumerator object. In other words, an outside object can query any pin with which it has contact to obtain the identity of the particular enumerator corresponding to the group which includes that pin. In this way, a user or application program which has only recently gained access to an output pin, can query that output pin to find the enumerator associated with that output pin. The external component can then invoke the method exposed by the enumerator to obtain a complete enumeration of the pins corresponding to that channel. The external component can thus quickly and accurately obtain the identity of the pins associated with any given reader module, or channel, being output by system <b>610</b>.
Indexing and Seeking
As discussed above, indexer <b>132</b> generates an index which contains index entries that are used for seeking. In other words, each of reader modules <b>614</b>-<b>620</b> can seek to any point in buffer <b>124</b> which has a corresponding entry in the index. In some instances, depending on the nature of the streaming information, substantially any point in buffer <b>124</b> can be indexed. However, for other types of streaming information, it may be desirable to index only certain points within the streaming information. Such points are referred to herein as sync points. In other words, the nature of the streaming information may render it unreasonable or undesirable to seek to certain points within the streaming information and begin rendering the data at that point.
For example, some video streaming information works on the well known MPEG2 video format. Such a format includes a number of different types of frames which are referred to as I frames, B frames, and P frames. I frames need no other information in order to be rendered, while B and P frames are dependent frames which require information in a preceding I frame in order to be rendered. In such an example, it may be undesirable to seek to a point within buffer <b>124</b> which begins with a B or P frame. In fact, many conventional video decoders may not even be able to decode data which is provided from a B or P frame, without the necessary information contained in the preceding I frame. Therefore, it may be highly desirable to index only I frames in such a video stream stored on buffer <b>124</b>.
Similarly, where the streaming information contains a stream, such as written text for closed captioning, it may be desirable to allow a user to seek to points which correspond to the beginning or ending of words, the beginning or ending of sentences, or the beginning or ending of paragraphs. The same is true for an audio stream. In other words, it may be desirable to allow a user to only seek to certain spots in the audio stream. Such spots may correspond to sentence or word boundaries, etc.
Therefore, one illustrative feature of the present invention includes a stream analyzer <b>654</b>, such as that illustrated in <figref idref="DRAWINGS">FIG. 21A</figref>. Stream analyzer <b>654</b> is shown coupled to a source <b>656</b> of streaming information and a sink <b>658</b> of streaming information. Stream analyzer <b>654</b> is configured to receive the streaming information from source <b>656</b> (which can be implemented as a software object).
In one illustrative embodiment, stream analyzer <b>654</b> embodies knowledge of the organization of the streaming information provided by source <b>656</b>. Analyzer <b>654</b> also illustratively embodies knowledge regarding the detection of logical boundaries in the information in order to obtain the location of those boundaries (sync points). The location of the sync points can then be presented to any other software or hardware component which may desire the information in order to enable skipping forward or backward through the streaming information more practicable.
Stream analyzer <b>654</b> illustratively provides an indication of the sync points in one of two ways. In a first embodiment, stream analyzer <b>654</b> embeds the location of the sync points within the streaming information itself, as it is provided to information sink <b>658</b>. This is referred to as in-band communication of derived sync point information.
In an alternative embodiment, stream analyzer <b>654</b> can provide the sync point information as indicated by dashed arrow <b>660</b>, separately from the streaming information provided to sink <b>658</b>. This is referred to as out-of-band communication of the derived sync point information.
In one illustrative embodiment, stream analyzer <b>654</b> is implemented in the C++ programming language using classes and communicating with other software objects using COM interfaces. However, it should be noted that such an implementation is illustrative only and the present invention is not limited to this particular method of implementation.
The information sink <b>658</b> can, of course, be a downstream filter (downstream of stream analyzer <b>654</b>) an application program, a rendering filter or other program component, etc. Sink <b>658</b> can use the derived sync point information itself, or simply pass it on to other components which may wish to use the derived sync point information. In one illustrative embodiment, the derived sync point information is provided to delay filter <b>112</b> which uses it in generating an index, as is described in greater detail below.
In another illustrative embodiment, not only does stream analyzer <b>654</b> analyze the incoming streaming information for logical boundaries which can be used as sync points, but stream analyzer <b>654</b> also analyzes the incoming streaming information for points of interest which may be desirable sync points. Such points of interest can be substantially any points which are deemed to possibly be of interest to the user. Therefore, in such an embodiment, stream analyzer <b>654</b> embodies knowledge of the type and format of information in the incoming stream, as well as knowledge of the types of events of interest to the user. Similarly, stream analyzer <b>654</b> is configured to contain knowledge of how to detect these points of interest in the incoming streaming information, and is provided with a mechanism to report the location in the data stream which corresponds to these points of interest.
<figref idref="DRAWINGS">FIGS. 21B and 21C</figref> are more detailed block diagrams illustrating stream analyzer <b>654</b> in accordance with illustrative embodiments of the present invention. <figref idref="DRAWINGS">FIG. 21B</figref> illustrates an embodiment of stream analyzer <b>654</b> in which the derived sync point information is provided out-of-band, while <figref idref="DRAWINGS">FIG. 21C</figref> illustrates an embodiment in which the derived sync point information is provided in-band.
In <figref idref="DRAWINGS">FIG. 21B</figref>, stream analyzer <b>654</b> includes point of interest (POI) analysis component <b>662</b>, point of interest interface component <b>664</b> and streaming information interface component <b>666</b>. The streaming information is provided from source <b>656</b> to point of interest analysis component <b>662</b> which calls on its base of knowledge regarding the type of information and the organization of information contained in the streaming information, as well as its knowledge regarding points of interest to the user. POI analysis component <b>662</b> then identifies points of interest in the streaming information and provides an output <b>668</b> which is indicative of the location of the points of interest (i.e., it is indicative of the sync points). Output <b>668</b> is provided to POI interface <b>664</b> which makes the information available to sink <b>658</b>. Similarly, POI analysis component <b>662</b> passes the incoming streaming information on to streaming information interface <b>666</b> such that the streaming information is separately available to sink <b>658</b>.
<figref idref="DRAWINGS">FIG. 21C</figref> is similar to <figref idref="DRAWINGS">FIG. 21B</figref> and similar items are correspondingly numbered. However, rather than having two separate interfaces <b>664</b> and <b>666</b> for the sync point information and for the streaming information, stream analyzer <b>654</b> illustrated in <figref idref="DRAWINGS">FIG. 21C</figref> has a single combined interface <b>669</b> which integrates the point of interest (or sync point) information into the streaming information and provides it as an in-band output to sink <b>658</b>. It should, of course, be noted that the integration of the sync point information can also be accomplished in POI analysis component <b>662</b>. In any case, a single output of streaming information (which contains the sync point information in-band) is provided to sink <b>658</b>.
<figref idref="DRAWINGS">FIG. 21D</figref> is a more detailed block diagram of one embodiment of point of interest analysis component <b>662</b>, in which in the integration of the sync point information into the streaming information provided at its output, is performed within point of interest analysis component <b>62</b>. POI component <b>662</b> includes, in the illustrative embodiment shown in <figref idref="DRAWINGS">FIG. 21D</figref>, parsing component <b>670</b>, written language analysis component <b>672</b>, video analysis component <b>674</b> and audio analysis component <b>676</b>. While any type of information analysis components can be used, components <b>672</b>, <b>674</b> and <b>676</b> are illustrated for exemplary purposes only. POI analysis component <b>662</b> also includes integration component <b>678</b>.
Parsing component <b>670</b> receives the streaming information at its input. In the embodiment illustrated, the streaming information may include a plurality of streams (although only a single stream may be processed as well), such as a written textual stream (e.g., closed caption information), a video stream and an audio stream. Parsing component <b>670</b> parses the incoming streaming information into its respective stream components and provides those components to appropriate analysis blocks <b>672</b>, <b>674</b> and <b>676</b>.
Analysis components <b>672</b>, <b>674</b> and <b>676</b> analyze the incoming streams, identify potential points of interest and generate information indicative of the location of the those points of interest. The streaming information, as well as the sync point information, is then provided from each analysis component <b>672</b>-<b>676</b>, to integration component <b>678</b>. In the embodiment illustrated, integration component <b>678</b> re-integrates the streams into the original streaming information, and also embeds the sync point information at appropriate locations within the streaming information. Thus, the in-band sync point information is provided in the data stream at the output of integration component <b>678</b>.
It should be noted that the analysis components <b>672</b>-<b>676</b> can look for substantially any desired points of interest. For example, written language component <b>672</b> can be configured to look for sentence boundaries or word boundaries. In looking for sentence boundaries, the analysis component can simply be configured to look for periods in the incoming stream. To look for word boundaries, component <b>672</b> can be configured to simply look for spaces in the incoming stream. It should also be noted that language analysis component <b>672</b> can be a more sophisticated analysis component, such as a natural language processing or natural language analysis component, in which case component <b>672</b> can be configured to identify certain types of clauses, surnames, parts of speech, etc. In any case, information indicative of the written language points of interest to be identified by component <b>672</b> is provided to component <b>672</b> such that the desired points of interest can be identified in the incoming stream.
Similarly, video analysis component <b>674</b> can be used to identify any number of different points of interest. For example, component <b>674</b> can be configured to identify commercial breaks, as well as to identify the I, B and P frames mentioned above. In identifying commercial breaks in the incoming video stream, video analysis component <b>674</b> can simply be configured to look for a black screen which exists for a certain predetermined amount of time. Similarly, in the MPEG2 video format, the I, B and P frames include markers identifying them as such, or are preceded by a header identifying the frames. Therefore, video analysis component <b>674</b> can be configured to look for the identifying information in the stream.
Audio analysis component <b>676</b> can also be configured to look for a wide range of points of interest. By way of example, if the incoming stream is from a horror genre film, a war genre film, or an action genre film or television program, audio analysis component can be configured to look for loud noises, such as screams, gun shots, or car chase noises. In that instance, component <b>676</b> can simply be configured to look for amplitude information which exceeds a predetermined threshold. Similarly, component <b>676</b> can be a more advanced component, such as a speech recognition or voice recognition component. In the instance in which component <b>676</b> includes a speech recognition component, it can be configured to look for sentence or word boundaries, or it can be used to look for particular words or phrases. For example, component <b>676</b> can be used to identify words of profanity which can be marked for later deletion. Similarly, where component <b>676</b> includes a voice recognition component, it can be configured to identify the voice of certain actors or actresses, or any other entity which can be so identified.
It should again be mentioned that the point of interest analysis component <b>662</b> can be configured to identify the location of substantially any point of interest which can be identified. Component <b>662</b> simply needs to be provided with the information indicative of points of interest to be analyzed, as well as information indicative of the type of information and format of information which will be received in the streams provided thereto. The specific embodiments mentioned above are simply provided as examples, and are not to be viewed as limiting the application of this feature of the present invention.
<figref idref="DRAWINGS">FIG. 22</figref> is a flow diagram which illustrates the operation of POI analysis component <b>662</b> in more detail. First, POI analysis component <b>662</b> receives the streaming information. This is indicated by block <b>680</b>. Parsing component <b>670</b> then parses the streaming information into its respective streams for a point of interest analysis. This is indicated at block <b>682</b>. At some point, prior to point of interest analysis, point of interest analysis information indicative of the points of interest to be identified must be provided to the various analysis components in POI analysis component <b>662</b>. This is indicated by block <b>684</b>. The streams are then analyzed based upon the received point of interest information as indicated by block <b>686</b>.
Once the point of interest information is derived from the streams, the streams are then reintegrated and the point of interest information is provided either in-band or out-out-band, along with the integrated streams. This is indicated by block <b>688</b>. The data stream and the point of interest information is then transmitted to a downstream component (such as delay filter <b>112</b>) for further processing. Again, it should be noted that the point of interest information can either be provided in-band or out-out-band. This is indicated by block <b>690</b> in <figref idref="DRAWINGS">FIG. 22</figref>.
<figref idref="DRAWINGS">FIGS. 23A</figref>, <b>23</b>B and <b>23</b>C are more detailed flow diagrams illustrating the operation of written language analysis component <b>672</b>, video analysis component <b>674</b> and audio analysis component <b>676</b>. <figref idref="DRAWINGS">FIG. 23A</figref> illustrates that written language analysis component <b>672</b> first receives the written language stream information (such as closed caption information). This is indicated by block <b>692</b>. Component <b>672</b> then analyzes the stream information to locate word or sentence boundaries, certain clauses, surnames or other parts of speech, etc. Again, the point of interest identified can be substantially any points of interest for which component <b>672</b> is properly configured. This is indicated by block <b>694</b>. Component <b>672</b> then provides an indication of the locations in the streaming information where the points of interest reside. This is indicated by block <b>696</b>.
<figref idref="DRAWINGS">FIG. 23B</figref> is similar to <figref idref="DRAWINGS">FIG. 23A</figref>, and similar items are correspondingly numbered. However, rather than locating textual points of interest, video analysis component <b>674</b> analyzes the video stream information for a black screen, image changes (which may correspond to desired scene changes), I, B and P frame markers, etc. This is indicated by block <b>698</b>.
<figref idref="DRAWINGS">FIG. 23C</figref> is similar to <figref idref="DRAWINGS">FIGS. 23A and 23B</figref>, and similar items are similarly numbered. However, rather than analyzing written language or video information, component <b>676</b> analyzes audio stream information. In the embodiment illustrated in <figref idref="DRAWINGS">FIG. 23C</figref>, component <b>676</b> analyzes the audio stream information for amplitude changes, sentence or word boundaries, certain content words (e.g., profanity), a certain persons voice, etc. This is indicated by block <b>700</b>.
Index Generation
As described above, reader modules <b>614</b>-<b>620</b> in system <b>610</b> are configured such that they can seek to any indexed point, in buffer <b>124</b>. For information streams which do not have sync points, it is reasonable for the reader module to seek to substantially any sample within buffer <b>124</b>. Therefore, in such information streams, any sample can be indexed. In such an embodiment, indexer <b>132</b> generates index entries which simply correspond to the desired granularity of the indexer. For instance, it may be desirable in certain streams to index points which are temporally spaced by approximately 0.25 seconds. With other information, it may be desirable to index points which are spaced by two seconds or more. In information streams which have no sync points, indexer <b>132</b> simply generates index entries identifying locations in buffer <b>124</b> which are separated by the desired granularity of the indexer.
However, as discussed in the previous section, many data streams will be provided with sync points. In those cases, it may be desirable for indexer <b>132</b> to generate index entries which correspond only to sync points. It will, of course, be noted that if sync points occur more frequently than the desired granularity of the index generator, every single sync point may not be indexed. However, if sync points do not occur more frequently than the desired granularity of the index generator, substantially every sync point may be indexed.
Under such an arrangement, a problem can arise. For example, in a given streaming architecture, stream analyzer <b>654</b> described above may not exist, or it may not yet know whether the streaming information it is receiving contains any sync points. That being the case, indexer <b>132</b> may not know, at the time it begins receiving streaming information, whether it must simply begin indexing samples according to its granularity, or whether it is to wait to index only sync points. <figref idref="DRAWINGS">FIG. 24</figref> is a flow diagram illustrating the operation of indexer <b>132</b> in addressing this problem.
First, indexer <b>132</b> simply executes a query against stream analyzer <b>654</b> to determine whether stream analyzer <b>654</b> can provide information as to whether the incoming streaming information contains sync points. This is indicated by block <b>702</b>. Stream analyzer <b>654</b> may not even provide a response, or it may provide a response indicating that it does not yet know whether the streaming information contains sync points. If analyzer <b>654</b> provides a response indicating that information indicative of whether sync points exist is available, a flag is set. The flag is referred to in <figref idref="DRAWINGS">FIG. 24</figref> as the “Sync Point Info Is Authoritative” flag. This is indicated by blocks <b>703</b> and <b>704</b>. If there is no information available that is indicative of whether sync points exist, this flag is reset, as indicated by blocks <b>703</b> and <b>705</b>.
Next, if information as to the presence or absence of sync points is available, it is determined whether any sync points are present. This is indicated by block <b>706</b>. If stream analyzer <b>654</b> has already identified sync points in the incoming streaming information, it provides indexer <b>132</b> with a response indicating that sync points do exist. In that case, indexer <b>132</b> sets a sync point flag to a value which indicates that the incoming streaming data does, in fact, contain sync points. This is indicated by block <b>707</b>. However, if stream analyzer <b>654</b> does not respond, or it has not yet located sync points in the incoming streaming information, and provides an output indicative of that to indexer <b>132</b>, indexer <b>132</b> assumes, for the moment, that there are no sync points in the incoming streaming information, and resets the sync point flag. This is indicated by block <b>708</b>. Indexer <b>132</b> then receives a sample of the streaming information as indicated by block <b>710</b>.
Upon receipt of the sample, indexer <b>132</b> analyzes the sample to see if the sample has been marked as a sync point. This is indicated by blocks <b>712</b> and <b>714</b>. If the sample has not been marked as a sync point, indexer <b>132</b> examines the sync point flag to see whether the sync point flag is set. This is indicated by block <b>716</b>. If, at block <b>716</b>, it is determined that the sync point flag is indeed set, that indicates that the streaming information being processed does contain sync points, and the present sample is not marked as a sync point. Therefore, indexer <b>132</b> does not index the sample under analysis but simply returns to processing at block <b>710</b>.
If, however, at block <b>716</b>, it is determined that the sync point flag is not set, indexer <b>132</b> is still assuming that no sync points exist in the incoming streaming information. Therefore, the indexer simply determines whether it should index the present sample under analysis, based on the desired granularity of indexer <b>132</b>. In other words, if indexer <b>132</b> is to index points no more often than every one half second (for example), indexer <b>132</b> determines whether the present sample is temporally removed from the previously indexed sample by at least one half second. If so, the present sample is indexed. If not, processing simply returns to block <b>710</b>. This is indicated by block <b>718</b>.
If, at block <b>714</b>, indexer <b>132</b> determines that the present sample is marked as a sync point, indexer <b>132</b> then determines whether the sync point flag is currently set. This is indicated at block <b>720</b>. If the sync point flag is currently set, indexer <b>132</b> simply continues processing at block <b>718</b> and determines whether it has reached sufficient temporal displacement from the previous index entry to index the present sync point.
However, if, at block <b>720</b> it is determined that, even though the present sample is marked as a sync point, the sync point flag is not set, then indexer <b>132</b> determines whether the “Sync Point Info Is Authoritative” flag is set, at block <b>721</b>. If not, then indexer <b>132</b> realizes that it has been assuming that no points exist in the streaming information under analysis, but it also realizes that sync points do actually exist. Therefore, indexer <b>132</b> discards all the previous index entries (since they corresponded to non-sync point samples) as indicated at block <b>722</b> and sets the sync point flag as indicated by block <b>724</b>. Processing then again continues with respect to block <b>718</b>. Similarly, if at block <b>721</b> it is determined that the “Sync Point Info Is Authoritative” flag is set, processing continues at block <b>718</b>.
Therefore, it can be seen that by using the algorithm illustrated in <figref idref="DRAWINGS">FIG. 24</figref>, this feature of the present invention can be used to accurately index points in the streaming information, regardless of whether the indexer currently knows whether the sync points are present in the streaming information. Where sync points are not present, samples will be indexed according to the desired granularity of the indexer. When sync points are present, only sync points will be indexed.
Time Shift Seeking with Multiple Streams
As described above, the streaming information stored in buffer <b>124</b> can include multiple streams. As is also describe above, it may be desirable to allow reader modules <b>614</b>-<b>620</b> (illustrated in <figref idref="DRAWINGS">FIG. 20</figref>) to seek to various points in the streaming information indexed by indexer <b>132</b>. This presents some difficulty. It is difficult to decide at which particular file offset within buffer <b>124</b> the particular reader module should begin reading, after a seek is requested. This decision is made difficult by a number of factors.
For example, the streams can be out of sync within the file located in buffer <b>124</b>. In other words, audio information can be stored before or after video information, and in different size storage blocks, such that the two do not directly coincide. Also, the reader module may request to seek to a position in buffer <b>12</b> (to a sample with a particular time stamp) for which no sync point has been indexed. In other words, as set out above, indexer <b>132</b> does not index every single sample. Instead, it only indexes based on its own granularity, or based on sync points. Therefore, a reader module may request to seek to a time stamp for which no index entry is available. Further, some streams may contain sync points while others may not. In addition, not all sync points may be indexed, since they may occur more frequently than the desired granularity of the index. One illustrative feature of the present invention is directed to addressing these obstacles in seeking through a channel having multiple streams.
<figref idref="DRAWINGS">FIG. 25</figref> is one exemplary illustration of a portion of buffer <b>124</b> which is divided into a plurality of buffered samples. Samples <b>730</b>, having cross-hatching in a first direction, represent samples of a first stream. Samples <b>732</b>, with cross-hatching in the opposite direction, correspond to samples of a second stream. Samples <b>734</b>A, <b>734</b>B, <b>734</b>C and <b>734</b>D, with no cross-hatching, correspond to samples of a third stream.
In order to address the obstacles identified above, one illustrative embodiment of the present invention is a seek algorithm which is described with respect to <figref idref="DRAWINGS">FIGS. 25 and 26</figref>. In the algorithm, the particular reader module conducting a seek seeks to a highest file offset within buffer <b>124</b> which is suitable to satisfy each of the stream's individual seeking requirements. The reader module then begins streaming information, but drops information for each of the streams being read which is read before the first sample that should actually be played for that stream. In addition, where no sync points with the exact time stamp have been indexed, the nearest sync point before the desired seek position is provided as a potential starting point, unless the nearest sync point before the desired seeking position is too far into the past. Since some streams contain no sync points, the present invention assumes that, in a stream with no sync points, every sample is a sync point. Finally, since not all sync points may be indexed, the seeking algorithm first finds a nearest indexed sync point before and after the desired seek position, and then determines the difference between the two indexed seek points to see whether there may be more sync points, which are not indexed, between the two. If so, the data between the two indexed sync points is read to determine whether additional sync points (and ones closer to the desired seek point) exist.
More specifically, <figref idref="DRAWINGS">FIG. 26</figref> is a flow diagram illustrating a seeking operation in accordance with one illustrative feature of the present invention. In order to seek to a position within buffer <b>124</b> (illustrated in <figref idref="DRAWINGS">FIG. 25</figref>) the designated reader module first receives a seek request to seek to a position in buffer <b>124</b> having a time stamp indicating time T. This is indicated by block <b>740</b>. In <figref idref="DRAWINGS">FIG. 25</figref>, the time stamp T corresponds to sample <b>734</b>C. In the illustrative embodiment, sample <b>734</b>C is not indexed.
Next, a variable FILEOFFSET is set to infinity (or a very large number). This is indicated by block <b>742</b>.
The first of the plurality of streams is then chosen for analysis. This is indicated by block <b>744</b>.
For the first stream, a time variable T<b>1</b> is set to the index entry with the highest time stamp before the desired seek time T. In <figref idref="DRAWINGS">FIG. 25</figref>, it can be seen that sample <b>734</b>A for the designated stream corresponds to the index entry T<b>1</b> which has the highest time stamp before the desired seek time T. If no such index entry exists, then T<b>1</b> is set to T−Z. In one illustrative embodiment, Z=100. This basically causes T<b>1</b> to be discarded as will be illustrated in later processing. This is indicated by block <b>746</b>.
Next, a time period T<b>2</b> is set to an index entry for the selected stream with the lowest time stamp after the desired seek time T. It can be seen that sample <b>734</b>D corresponds to a sample in the selected stream which is indexed, and which has the lowest time stamp to the right of time T (e.g., after time T). If no such index entry exists, the presently selected stream is ignored for purposes of computing the file offset, and a new stream is selected. This is indicated by block <b>748</b>.
Thus, after processing at block <b>748</b>, it can be seen that the two index entries which lie on either side of time T, and which are closest to time T, have been identified. Those index entries correspond to times T<b>1</b> and T<b>2</b>. The temporal displacement between the desired time T and the previously indexed time T<b>1</b> is represented by X=T−T<b>1</b>. The temporal displacement between the desired seek time T and the subsequent index entry T<b>2</b> is represented by Y=T<b>2</b>−T.
If both X and Y are greater than a predetermined time interval (e.g., five seconds) that indicates that both of the indexed samples T<b>1</b> and T<b>2</b> are too far from the desired seek position T to be helpful. This determination is indicated by block <b>750</b>. If it is the case that X and Y are greater than the predetermined time interval, then the present stream is simply ignored in computing FILEOFFSET. This is indicated by block <b>752</b>. Processing then continues at block <b>754</b> where it is determined whether additional streams exist. If so, a next stream is selected at block <b>756</b> and processing continues with respect to block <b>746</b>. If no additional streams exist, a seek is performed at block <b>758</b>, which is described in greater detail below.
If, at block <b>750</b>, it is determined that both values X and Y are not greater than the predetermined time interval, then it is determined whether either X or Y are greater than the predetermined time interval. For example, at block <b>760</b>, it is determined whether value X (which corresponds to T−T<b>1</b>) is greater than five seconds. If so, then the value Y must not be greater than five seconds, and a variable FILE_OFFSET_THIS_STREAM is set to index value T<b>2</b>. This is indicated by block <b>762</b>.
If, at block <b>760</b>, it is determined that the value of X is not greater than five seconds, then it is determined whether the value Y is greater than five seconds. If so, then the value T<b>2</b> can be ignored and the variable FILE_OFFSET_THIS_STREAM is set to value T<b>1</b>. This is indicated by blocks <b>764</b> and <b>766</b>.
Basically, blocks <b>760</b>-<b>766</b> determine whether either index values T<b>1</b> or T<b>2</b> are too far separated from the desired seek time T to be of help. If they are, they are eliminated from further computing.
If, however, at block <b>764</b>, it is determined that the value Y is not greater than five seconds, that means that both samples corresponding to values T<b>1</b> and T<b>2</b> are close enough to desired seek time T to be of interest. That being the case, it is determined whether other sync points between T<b>1</b> and T<b>2</b> may exist. In other words, if a distance between T<b>1</b> and T<b>2</b> is so small that no other sync points could have been indexed between them (based on the desired granularity of the indexer) then additional sync points may exist between samples T<b>1</b> and T<b>2</b> which are closer to the desired seek position T, but which have simply been omitted from the index because the granularity of the indexer was not sufficient to accommodate an additional index entry.
Therefore, a search algorithm is conducted in which the samples of the selected stream which reside between samples T and T<b>1</b> are searched to determine whether they are in fact sync points. If so, that would mean that those sync points are closer in time to the desired seek position T, and are prior in time to that seek position. If that is true, then the variable FILE_OFFSET_THIS_STREAM is set to the value corresponding to that identified sync point. This is indicated by blocks <b>768</b> and <b>770</b>.
Therefore, at this point in the processing, the desired file offset for the stream under analysis has either been chosen to be T<b>1</b>, T<b>2</b>, or a value between T<b>1</b> and T. Then, for the stream under analysis, the seek algorithm requests subsequent filters in the streaming process to ignore any data samples which are read out of buffer <b>12</b> and have time stamps prior to that identified by the variable FILE_OFFSET_THIS_STREAM. This is indicated by block <b>772</b>.
Once the variable FILE_OFFSET_THIS_STREAM has been derived, it is determined whether that value is less than the current value of the variable FILEOFFSET. If this is the first selected stream, the value will be less than the current value of FILEOFFSET, which has been set to infinity. However, if this was a second, third, or later selected stream, then the file offset for the present stream under analysis will be used as the value for the variable FILEOFFSET only if it is further to the left (or earlier in time) than the current value for the variable FILEOFFSET. This has the effect of moving the seek point which will actually be used in seeking in buffer <b>124</b> to a point far enough left in the buffer to satisfy every stream's individual seeking requirements. This is indicated by block <b>774</b>.
Next, processing continues at block <b>754</b> where it is determined whether additional streams need to be analyzed. If so, processing continues at block <b>756</b>. If not, processing continues at block <b>758</b>. In block <b>758</b>, the selected reader module is commanded to seek to the sample identified by the variable FILEOFFSET and start streaming data from buffer <b>124</b> at that point. Since in block <b>772</b>, a value has been set for each stream indicating that streamed data prior to the desired sync point for that stream is to be ignored, the data streamed out of buffer <b>124</b> will not be rendered for a given stream unless that data is coincident with, or after, the earliest sync point identified for that given stream (and identified by the variable FILE_OFFSET_THIS_STREAM).
One embodiment of pseudocode corresponding to the flow diagram of <figref idref="DRAWINGS">FIG. 26</figref> is set out below:
<tables id="TABLE-US-00001" num="00001"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><thead><row><entry /><entry namest="offset" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry> FileOffset = INFINITY</entry></row><row><entry /><entry> for (every connected stream) {</entry></row><row><entry /><entry> T1 = Find the index entry with the highest</entry></row><row><entry /><entry>timestamp before T;</entry></row><row><entry /><entry> if (T1 does not exist)</entry></row><row><entry /><entry> T1 = T − 100;//so that we ignore T1</entry></row><row><entry /><entry> T2 = Find the index entry with the lowest</entry></row><row><entry /><entry>timestamp after T;</entry></row><row><entry /><entry> If (T2 does not exist)</entry></row><row><entry /><entry> Continue;//no index - ignore this stream in</entry></row><row><entry /><entry>computing file offset</entry></row><row><entry /><entry> If ((T − T1 > 5sec) AND (T2 − T > 5sec))</entry></row><row><entry /><entry> Break;</entry></row><row><entry /><entry> else if (T − T1>5sec)//“too far”</entry></row><row><entry /><entry> FileOffsetForThisStream = FileOffset(T2);</entry></row><row><entry /><entry> Else if (T2 − T > 5sec)//“too far”</entry></row><row><entry /><entry> FileOffsetForThisStream = FileOffset(T1);</entry></row><row><entry /><entry> Else {//neither one is “too far”</entry></row><row><entry /><entry> Search through the portion of the file</entry></row><row><entry /><entry>between FileOffset(T1) and FileOffset(T2)</entry></row><row><entry /><entry> To find the sync point with the highest time</entry></row><row><entry /><entry>stamp that is still below T.</entry></row><row><entry /><entry> The position of that sync point becomes</entry></row><row><entry /><entry>FileOffsetForThisStream.</entry></row><row><entry /><entry> Then tell the splitter to discard any</entry></row><row><entry /><entry>samples for this stream whose timestamps</entry></row><row><entry /><entry> are smaller than the one we just found.</entry></row><row><entry /><entry> }</entry></row><row><entry /><entry> If (FileOffsetForThisStream < FileOffset)\</entry></row><row><entry /><entry> FileOffset = FileOffsetForThisStream;</entry></row><row><entry /><entry> }</entry></row><row><entry /><entry> Seek to FileOffset and start streaming.</entry></row><row><entry /><entry namest="offset" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
Thus, it can be seen that the algorithm illustrated in <figref idref="DRAWINGS">FIG. 26</figref> solves a number of problems. With respect to streams that can be out of sync in a file, the algorithm seeks to the highest file offset suitable to satisfy every stream's individual seeking requirements. The reader module then begins streaming at that point, but drops everything prior to the first sample that should actually be played for each given stream. Similarly, where no sync point exists with the exact desired time stamp (the desired seek position), the seek position is set to the nearest sync point before the desired seek position, unless the nearest sync point is too far to the left (into the past). Also, since some streams may contain seek points while others may not, every sample in a stream without seek points is deemed to be a suitable seek point. Finally, since not all seek points may be indexed, the seeking algorithm first finds the nearest indexed seek points before and after the desired seek position and then looks at the difference between those indexed points to determine whether any sync points may reside between them. If so, the samples to the left of the desired seek position are read to look for additional sync points.
Although the present invention has been described with reference to preferred embodiments, workers skilled in the art will recognize that changes may be made in form and detail without departing from the spirit and scope of the invention.
Contents5
26 sheets
Sheet 1 Sheet 2 Sheet 3 Sheet 4 Sheet 5 Sheet 6 Sheet 7 Sheet 8 Sheet 9 Sheet 10 Sheet 11 Sheet 12 Sheet 13 Sheet 14 Sheet 15 Sheet 16 Sheet 17 Sheet 18 Sheet 19 Sheet 20 Sheet 21 Sheet 22 Sheet 23 Sheet 24 Sheet 25 Sheet 26
Every citation, both waysCites: the store holds 80 of 81
| Document | Relation | Office | Cited during |
|---|---|---|---|
| US8626941B2 | Cited by | United States of America | Search report |
| US8244899B1 | Cited by | United States of America | Search report |
| US8667248B1 | Cited by | United States of America | Search report |
| WO0060820A2 | Cites | World Intellectual Property Organization (WIPO) | Applicant |
| WO03007558A1 | Cites | World Intellectual Property Organization (WIPO) | Applicant |
| EP0633694A1 | Cites | European Patent Office (EPO) | Applicant |
| EP0702370A2 | Cites | European Patent Office (EPO) | Applicant |
| EP0713341A2 | Cites | European Patent Office (EPO) | Applicant |
| EP0727911A2 | Cites | European Patent Office (EPO) | Applicant |
| EP0756281A2 | Cites | European Patent Office (EPO) | Applicant |
| EP0789488A2 | Cites | European Patent Office (EPO) | Applicant |
| EP0812108A2 | Cites | European Patent Office (EPO) | Applicant |
| US2003200548A1 | Cites | United States of America | Applicant |
| US2005132101A1 | Cites | United States of America | Search report |
| US2006133456A1 | Cites | United States of America | Search report |
| US4901286A | Cites | United States of America | Applicant |
| US5136655A | Cites | United States of America | Applicant |
| US5339418A | Cites | United States of America | Applicant |
| US5349611A | Cites | United States of America | Applicant |
| US5351236A | Cites | United States of America | Applicant |
| US5371551A | Cites | United States of America | Applicant |
| US5371842A | Cites | United States of America | Applicant |
| US5414455A | Cites | United States of America | Search report |
| US5463630A | Cites | United States of America | Applicant |
| US5566301A | Cites | United States of America | Applicant |
| US5568443A | Cites | United States of America | Applicant |
| US5596581A | Cites | United States of America | Applicant |
| US5596582A | Cites | United States of America | Applicant |
| US5596645A | Cites | United States of America | Applicant |
| US5598276A | Cites | United States of America | Applicant |
| US5664226A | Cites | United States of America | Applicant |
| US5692213A | Cites | United States of America | Applicant |
| US5729471A | Cites | United States of America | Applicant |
| US5754773A | Cites | United States of America | Applicant |
| US5758011A | Cites | United States of America | Applicant |
| US5761417A | Cites | United States of America | Applicant |
| US5774643A | Cites | United States of America | Applicant |
| US5784527A | Cites | United States of America | Applicant |
| US5802394A | Cites | United States of America | Applicant |
| US5805821A | Cites | United States of America | Applicant |
| US5835667A | Cites | United States of America | Applicant |
| US5838876A | Cites | United States of America | Applicant |
| US5850572A | Cites | United States of America | Applicant |
| US5878280A | Cites | United States of America | Applicant |
| US5915094A | Cites | United States of America | Applicant |
| US5930493A | Cites | United States of America | Applicant |
| US5995091A | Cites | United States of America | Applicant |
| US6038636A | Cites | United States of America | Applicant |
| US6055619A | Cites | United States of America | Applicant |
| US6058106A | Cites | United States of America | Applicant |
| US6097380A | Cites | United States of America | Applicant |
| US6134596A | Cites | United States of America | Applicant |
| US6172927B1 | Cites | United States of America | Applicant |
| US6195680B1 | Cites | United States of America | Applicant |
| US6195701B1 | Cites | United States of America | Applicant |
| US6233389B1 | Cites | United States of America | Applicant |
| US6233629B1 | Cites | United States of America | Applicant |
| US6239793B1 | Cites | United States of America | Applicant |
| US6247069B1 | Cites | United States of America | Applicant |
| US6249319B1 | Cites | United States of America | Applicant |
| US6260156B1 | Cites | United States of America | Applicant |
| US6275899B1 | Cites | United States of America | Applicant |
| US6304924B1 | Cites | United States of America | Applicant |
| US6314466B1 | Cites | United States of America | Applicant |
| US6324235B1 | Cites | United States of America | Applicant |
| US6407740B1 | Cites | United States of America | Search report |
| US6493347B2 | Cites | United States of America | Applicant |
| US6813731B2 | Cites | United States of America | Search report |
| US6912637B1 | Cites | United States of America | Applicant |
| WO9748049A2 | Cites | World Intellectual Property Organization (WIPO) | Applicant |
| US20030200548A1 | Cites | United States of America | Third party observation |
| US20050132101A1 | Cites | United States of America | Search report |
| US20060133456A1 | Cites | United States of America | Search report |
| EP633694A | Cites | European Patent Office (EPO) | Third party observation |
| EP702370A2 | Cites | European Patent Office (EPO) | Third party observation |
| EP713341A | Cites | European Patent Office (EPO) | Third party observation |
| EP727911A | Cites | European Patent Office (EPO) | Third party observation |
| EP756281A | Cites | European Patent Office (EPO) | Third party observation |
| EP789488A | Cites | European Patent Office (EPO) | Third party observation |
| EP812108A | Cites | European Patent Office (EPO) | Third party observation |
| WO9748049A | Cites | World Intellectual Property Organization (WIPO) | Third party observation |
| WO0060820 | Cites | World Intellectual Property Organization (WIPO) | Third party observation |
| WO3007558A | Cites | World Intellectual Property Organization (WIPO) | Third party observation |
| Kunzman, A.J. et al., 1934 High Performace Serial Bus: The Digital Interface for ATV: IEEE Transactions on Consumer Electornics, US, IEEE Inc., New York, vol. 1, No. 3, pp. 893-900, Aug. 1, 1995. | Non-patent | – | Applicant |
| "Data Rate Matching Buffer", IBM Technical Disclosure Bulletin, IBM Crop., New York, vo. 29, No. 4, Sep. 1, 1986. | Non-patent | – | Applicant |
| "The Vision Thing", Conference Proceedings, Windows Hardware Engineering Conference, Mar. 25-27, 1998. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks and Showtime Networks, Inc. Announce Personal TV Deal for Showtime, The Movie Channel, Sundance Channel and FLIX", http://www.replaytv.com/news/release-014.html. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks, Inc. Announces $8 Million Investment with Venture Firm Kleiner Perkins Caufield & Byers as Lead Investor", Mar. 29, 1999, http://www.replaytv.com/news/release-014.html. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay TV(TM) Features at David Coursey's Showcase '99", Jan. 28, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks, Inc. Announces Backing by Vulcan Ventures", Jan. 7, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks, Inc. and Runco Announce Home Theater OEM Agreement", Jan. 7, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks Announces Product Line, Pricing, Shipping", Jan. 7, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks and E? Entertainment Television Networks Sign Agreement to Deliver Content to Replay TV Viewers", Jan. 7, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay TV Wins CES 199 'Best of Show' Award", Jan. 6, 1999. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay Networks, Inc. to Start National Service Trails Next Week", Dec. 17, 1998. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Replay TV Wins Popular Science 1998 Best of What's New Award", Nov. 11, 1998. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Former Compaq Senior Marketing Exec Kevin Bohren Joins Replay Networks, Inc. Board of Directors", Nov. 9, 1998. | Non-patent | – | Applicant |
| Replay Networks, Inc., Press Release, "Netscape Co-founder Marc Andreessen Joins Replay Networks Board", Nov. 9, 1998. | Non-patent | – | Applicant |
| Replay Networks, Inc., Replay TV(TM) Reinvents Television and Vows to Viewers, 'You'll Never Miss Your Favorite Shows Again', Sep. 14, 1998, http://www.replaytv.com/news/release-001.html. | Non-patent | – | Applicant |
| Jesse Berts' AnchorDesk, "Replay TV:VCR Death Sentence?", Nov. 3, 1998, http://www.zdet.com/anchordesk/story/story-2703.html. | Non-patent | – | Applicant |
18 members in 3 offices
Priority claims10
| Document | Office | Kind | Date |
|---|---|---|---|
| 28680899 | United States of America | A | |
| 28680899 | United States of America | A | |
| 82761904 | United States of America | A | |
| 82761904 | United States of America | A | |
| 9801805 | United States of America | A | |
| 09286808 | – | – | – |
| 10827619 | – | – | – |
| US19990286808 | – | – | – |
| US20040827619 | – | – | – |
| US20050098018 | – | – | – |
Members18
| Document | Office | Kind | |
|---|---|---|---|
| WO0060820A2 | World Intellectual Property Organization (WIPO) | A2 | |
| AU4045400A | Australia | A | |
| WO0060820A3 | World Intellectual Property Organization (WIPO) | A3 | |
| US6748481B1 | United States of America | B1 | |
| US2005060446A1 | United States of America | A1 | |
| US2005235112A1 | United States of America | A1 | |
| US2005235113A1 | United States of America | A1 | |
| US2005240730A1 | United States of America | A1 | |
| US2005246456A1 | United States of America | A1 | |
| US2005246457A1 | United States of America | A1 | |
| US2005283547A1 | United States of America | A1 | |
| US7089348B2 | United States of America | B2 | |
| US7139868B2 | United States of America | B2 | |
| US7139869B2 | United States of America | B2 | |
| US7146458B2 | United States of America | B2 | |
| US7149868B2 | United States of America | B2 | |
| US7334078B2 | United States of America | B2 | |
| US7558918B2This record | United States of America | B2 |
47 transactions on the USPTO file
Allowed after 1 non-final rejection, 1 final rejection and 1 RCE.
- Non-final rejections
- 1
- Final rejections
- 1
- RCEs
- 1
- Appeals
- 0
Over time
Point at a mark for the transactionTransactions
| Event | Code | |
|---|---|---|
| Expire PatentEXP. | EXP. | |
| Maintenance Fee Reminder MailedREM. | REM. | |
| Recordation of Patent Grant MailedPGM/ | PGM/ | |
| Patent Issue Date Used in PTA CalculationAllowedPTAC | PTAC | |
| Issue Notification MailedAllowedWPIR | WPIR | |
| Dispatch to FDCD1935 | D1935 | |
| Dispatch to FDCD1935 | D1935 | |
| Application Is Considered Ready for IssuePILS | PILS | |
| Issue Fee Payment VerifiedN084 | N084 | |
| Issue Fee Payment ReceivedIFEE | IFEE | |
| Mail Notice of AllowanceAllowedMN/=. | MN/=. | |
| Notice of Allowance Data Verification CompletedAllowedN/=. | N/=. | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Disposal for a RCE / CPA / R129AbandonedABN9 | ABN9 | |
| Request for Continued Examination (RCE)RCEX | RCEX | |
| Workflow - Request for RCE - BeginBRCE | BRCE | |
| Mail Advisory Action (PTOL - 303)MCTAV | MCTAV | |
| Advisory Action (PTOL-303)CTAV | CTAV | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Response after Final ActionA.NE | A.NE | |
| Mail Final Rejection (PTOL - 326)Final rejectionMCTFR | MCTFR | |
| Final RejectionFinal rejectionCTFR | CTFR | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Response after Non-Final ActionA... | A... | |
| Mail Non-Final RejectionNon-final rejectionMCTNF | MCTNF | |
| Non-Final RejectionNon-final rejectionCTNF | CTNF | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Transfer Inquiry to GAUTI1050 | TI1050 | |
| Miscellaneous Incoming LetterLET. | LET. | |
| Information Disclosure Statement consideredIDSC | IDSC | |
| Reference capture on IDSRCAP | RCAP | |
| Electronic Information Disclosure StatementEIDS. | EIDS. | |
| Information Disclosure Statement (IDS) FiledWIDS | WIDS | |
| Correspondence Address ChangeC.AD | C.AD | |
| IFW TSS Processing by Tech Center CompleteTSSCOMP | TSSCOMP | |
| Reference capture on IDSRCAP | RCAP | |
| Information Disclosure Statement (IDS) FiledM844 | M844 | |
| Information Disclosure Statement (IDS) FiledWIDS | WIDS | |
| Application Dispatched from OIPEOIPE | OIPE | |
| Application Is Now CompleteCOMP | COMP | |
| Payment of additional filing fee/PreexamFLFEE | FLFEE | |
| A statement by one or more inventors satisfying the requirement under 35 USC 115, Oath of the ApplicOATHDECL | OATHDECL | |
| Notice Mailed--Application Incomplete--Filing Date AssignedINCD | INCD | |
| Cleared by OIPE CSRL194 | L194 | |
| IFW Scan & PACR Auto Security ReviewSCAN | SCAN | |
| Initial Exam Team nnIEXX | IEXX |
9 legal events, as the office reported them to INPADOC
Over the term
Point at a mark for the eventEvents
| Event | Code | |
|---|---|---|
| Lapsed due to failure to pay maintenance feeLapsedFP | FP | |
| Lapse for failure to pay maintenance feesLapsedPATENT EXPIRED FOR FAILURE TO PAY MAINTENANCE FEES (ORIGINAL EVENT CODE: EXP.); ENTITY STATUS OF PATENT OWNER: LARGE ENTITYLAPS | LAPS | |
| Information on status: patent discontinuationPATENT EXPIRED DUE TO NONPAYMENT OF MAINTENANCE FEES UNDER 37 CFR 1.362STCH | STCH | |
| Fee payment procedureMAINTENANCE FEE REMINDER MAILED (ORIGINAL EVENT CODE: REM.); ENTITY STATUS OF PATENT OWNER: LARGE ENTITYFEPP | FEPP | |
| Fee paymentFPAY | FPAY | |
| AssignmentAS | AS | |
| Fee paymentFPAY | FPAY | |
| Information on status: patent grantGrantedPATENTED CASESTCF | STCF | |
| AssignmentAS | AS |
Numbers
- Publication
- 7558918
- Publication, DOCDB
- 7558918
- Publication, EPODOC
- US7558918
- Application
- 11098018
- Application, DOCDB
- 9801805
- Application, EPODOC
- US20050098018
Titles
- English
- System for handling streaming information using a plurality of reader modules by enumerating output pins and associated streams of information
Patent term adjustment
- A delay
- +713 daysthe office missed an examination deadline
- Applicant delay
- −90 days
- Net adjustment
- 623 days
Classification
- CPC, 6
- H04N21/44004
- G11B20/10
- G11B27/034
- G11B27/105
- G11B27/322
- G11B2020/10666
- IPC, 5
- G06F12 00
- G06F3 00
- G06F12 08
- G11B20 10
- H04N21 44
- USPC, 3
- 711118000
- 711156000
- 711167000