One of the things I've been thinking about writing about is interesting and common math problems. I'll start with some easy ones that I've had to do at work (no trade secrets, just common math in the trade). Notes: - I'll use the prefix "0x" to denote that the number is written in hex notation. E.g.'s 0x10 is 16, 0x1F is 31. - There's 8 bits in a byte (I may not get to that until later problems though). Largest packet aligned buffer: MPEG 2 transport streams have both 188 and 204 byte packets. In order to transfer a high speed transport stream, large buffers are needed. Large buffers reduce the number of interrupts per second, and make for effective DMA transfers. To effectively process an MPEG-II transport stream, buffers should be a multiple of the packet size. Splitting and joining buffers is not only "a pain" to program, but also requires otherwise unnecessary processing power. With a maximum buffer size of 0x20000 (131072) bytes, and a chosen packet size of 188, what is the largest packet aligned buffer size allowed? The answer is simply 131072/188*188 when the division is integer division (i.e. no decimal places). To do this with a calculator that only does regular division, one simply needs to remember the integer part of the division. In this case 131072/188=697..... So, then I just clear the calculator, and type 697*188 and get 131036 (0x1FFDC). ... With a maximum buffer size of 0x20000 (131072) bytes, and a chosen packet size of 204, what is the largest packet aligned buffer size allowed? The answer is 131072/204*204 where the division is integer division. The final number is then 130968 (0x1FF98). What is the minimum buffer size that is divisible by both 188 and 204? To solve this, take out the common factors, and multiply the remaining together. The factors in 188 are: 2, 2, 47. The factors in 204 are: 2, 2, 3, 17. So the answer is 2*2*47*3*17=9588 (0x2574), or 188*204/2/2=9588 (0x2574). With a maximum buffer size of 0x20000 (131072) bytes, and a packet size that can only be 188 or 204, what is the largest packet aligned buffer allowed? Using the knowledge from above that 9588 bytes is the smallest multiple of both 188 and 204, it's simply 131072/9588*9588 (again where the division is integer division). So the answer is 124644 (0x1E6E4). Other numbers of interest: - 196=188+8(64 bits is 8 bytes) for a 188 byte packet with a 64 bit timestamp. - 212=204+8 for a 204 byte packet with a 64 bit timestamp. - 512 bytes is a common write size divisor for hard drives. - 192=188+4(32 bits is 4 bytes) for the MPEG stride (MPEG 2 transport stride?) format (HDV). - 4 bytes (32 bits) seems to be a preferred DMA number (the PCI bus is always at least 32 bits wide). - 8 bytes (64 bits) might be preferred for certain DMA. I'll probably write myself up a quick reference. When programming, you can have the program calculate the right numbers given any buffer size, packet size or other factor. Originally from: http://www.boxheap.net/ddaniels/notes/20050820.txt
August 20, 2005
20050820
Comments Off on 20050820
No Comments
No comments yet.
RSS feed for comments on this post.
Sorry, the comment form is closed at this time.