One of the things I've been thinking about writting 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 writen 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 interupts per second, and make for effective DMA transferes. To effectivly 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 unnessicary 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 divisable 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 alligned 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 prefered DMA number (the PCI bus is always at least 32 bits wide). - 8 bytes (64 bits) might be prefered 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.