What I hate about the Theora codec.

TheoraIDHeaderDiagram

For the past three weeks or so, I’ve been writing C code again. It’s been both fun and frustrating, since it’s been probably twenty years or so since I’ve done any serious coding in that language. The application is for a startup, and I can’t reveal the specific task I’m doing, but it involves reading data from a video stream.

I could have used any video technology I wanted, but to avoid patent encumberances I went with the Ogg container format with the Theora video CODEC. Luckily, I don’t need to actually decompress the video stream, I just need to be able to manipulate it at the frame/page level. Shouldn’t be too hard, and for the most part it wasn’t. I started by looking at the reference implementations for Ogg and Theora (libogg and libtheora), but they were a little too full-featured for my application, so I started to roll my own.

Things were going pretty well, until I got into the Theora identification header. I’d read the relevant parts of the spec and did some poking around with a hex viewer on my sample Ogg files. Everything looked good, so I created a C structure definition that I thought matched the header:

 

typedef struct __attribute__ ((__packed__)) _THEORA_ID_HEADER {
THEORA_HEADER HDR; // Common header.
byte VMAJ; // The major version number.
byte VMIN; // The minor version number.
byte VREV; // The version revision number.
uint16 FMBW; // The width of the frame in macro blocks.
uint16 FMBH; // The height of the frame in macro blocks.
uint PICW:24; // The width of the picture region in pixels.
uint PICH:24; // The height of the picture region in pixels.
byte PICX; // The X offset of the picture region in pixels.
byte PICY; // The Y offset of the picture region in pixels.
uint32 FRN; // The frame-rate numerator.
uint32 FRD; // The frame-rate denominator.
uint PARN:24; // The pixel aspect-ratio numerator.
uint PARD:24; // The pixel aspect-ratio denominator.
byte CS; // The color space.
uint NOMBR:24; // The nominal bitrate of the stream, in bits per second.
ushort QUAL:6; // The quality hint.
ushort KFGSHIFT:5; // The amount to shift the key frame number by in the granule position
ushort PF:2; // Pixel format.
ushort RES:3; // Reserved.
} THEORA_ID_HEADER;

The only problem: the values I read from an actual Theora stream didn’t match the header. They almost matched. Except for the one field I actually cared about (of course). I need the KFGSHIFT field to interpret the granule positions of the Ogg stream, and even though it’s apparently hardcoded to 6 in every library out there, my OCD wouldn’t let me get by with that. I wanted the real value from the stream. So, I fired up a hex editor in Atom and started digging.

TheoraHeaderHexDump

After counting bytes, and recounting bytes, I found the offending 16 bit value that contains the bitfields in the header: 00 c0. Or, bitwise:

msb                         lsb
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+---------------+--------------
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Which didn’t match the diagram in the Theora spec. Looking at that diagram, I was expecting: 80 01.

msb                         lsb
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+---------------+--------------
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0

WTF?! I expected QUAL, PF, and RES to all be 0. I expected KFGSHIFT to be 6. Why were the two most-significant bits set? What was going on? So I went back to the Theora spec. I read the code for the Theora reference implementation (libtheora). Finally, buried in section 5.2 of the spec I found the explanation of this craziness.

The decoder logically unpacks integers by first reading the MSb of a binary integer from the logical bitstream, followed by the next most significant bit, etc., until the required number of bits have been read. When unpacking the bytes into bits, the decoder begins by reading the MSb of the integer to be read from the most significant unread bit position of the source byte, followed by the next-most significant bit position of the destination integer, and so on up to the requested number of bits. Note that this differs from the Vorbis I codec, which begins decoding with the LSb of the source integer, reading it from the LSb of the source byte. When all the bits of the current source byte are read, decoding continues with the MSb of the next byte. Any unfilled bits in the last byte of the packet MUST be cleared to zero by the encoder.

So, logically bits are written to the Theora stream most-significant bit first. Okaaaay. A lot of people would look at this and say “well, they must have had a good reason for this”. I’ve been bit-twiddling since the early 80s, and I can unequivocally tell you: they don’t. This scheme is just confusing and crazy.

Sure, if you just write a bit streaming library and call it to read and write all of your values, you’ll never see this aspect. But just look at the structure in figure 6.2 above: only four values cannot be expressed in even byte quantities. A structure with bitfields is a fine way to deal with this problem, but instead of the bit fields in the header being arranged like this:

msb                         lsb
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+---------------+--------------
R R R P P K K K K K Q Q Q Q Q Q
Q = QUAL, K = KFGSHIFT, P = PF, R = RES

They’re actually arranged like this:

msb                         lsb
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+---------------+--------------
K K K P P R R R Q Q Q Q Q Q K K
Q = QUAL, K = KFGSHIFT, P = PF, R = RES

So, yes, that five-bit KFGSHIFT field is arranged so that it is virtually impossible to reference it as a single quantity, bit-wise. You can’t shift, you can’t mask. You have to access each piece separately and combine them. They also bear no resemblance to the diagram in the spec. So, my new, not-so-attractive structure looks like this (most fields omitted for brevity):

typedef struct __attribute__ ((__packed__)) _THEORA_ID_HEADER {
  . . .
  // !!!HACK!!! ok, per the Theora spec, bit fields are
  // "read" and "written" to bytes most-significant bit first. This means
  // that the KFGSHIFT field (which is, of course, the only field I'm interested
  // in here) isn't stored contiguously in the file. The MSBs are in the first
  // byte, the LSBs in the second. Crazy. http://www.theora.org/doc/Theora.pdf
  ushort KFGSHIFT_MSB:2;		// The amount to shift the key frame number by in the granule position
  ushort QUAL:6;		// The quality hint.

  ushort RES:3;     // Reserved.
  ushort PF:2;      // Pixel format.
  ushort KFGSHIFT_LSB:3;		// The amount to shift the key frame number by in the granule position
} THEORA_ID_HEADER;

#define THEORA_GET_KFGSHIFT(th) ((th).KFGSHIFT_MSB << 3 | (th).KFGSHIFT_LSB)

So, that structure along with the helper macro will give me the KFGSHIFT value I wanted, aka 6. Hopefully the next person implementing Theora will find this post and save themselves a head-desk moment.

One comment

  1. Tim Jowers says:

    Totally matches what I’ve found in using libraries – even Java: the edge cases are often not programmed for and end up taking me a few days to create work-arounds. I notice you often roll-your-own when doing UI layer work and have come around to that approach myself. The libraries are just too brittle both in js and in Android.

  2. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You mentioned this superbly!

    what mg viagra should i take levitra or viagra
    buy viagra online
    amature videos viagra sleep – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  3. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Thanks a lot.

    viagra ceallis viagra australia
    generic viagra 100mg
    herbal viagra london – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  4. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You said it nicely..

    can i break a viagra pill cialis vs viagra vs levitra
    viagra without a doctors prescription
    dr oz viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  5. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually revealed this well.

    viagra and unicure pharmacy joke viagra ads
    viagra without a doctors prescription
    lawsuits viagra heart attacks – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  6. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Incredible quite a lot of good material!

    ni teens forum sildenafil viagra viagra therapy
    buy viagra online
    nhs england viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  7. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You revealed that wonderfully.

    viagra extacy ashanti how buy viagra
    buy viagra online
    viagra consumer advice – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  8. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thanks a lot! I value it!

    viagra 100mg dosage buying viagra online safe
    buy viagra
    scam natural viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  9. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Thanks a lot!

    viagra k find search edinburgh pages louisville commercial viagra
    buy generic viagra
    supreme suppliers viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  10. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you. Plenty of facts!

    is viagra prescription in canada online prescriber of viagra
    viagra generic
    purchase viagra online cheapest pri – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  11. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    This is nicely put. !

    before after viagra does viagra keep an erection longer
    viagra for sale uk
    viagra in the waters – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  12. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos. A good amount of forum posts!

    fucking on viagra video using viagra on females
    generic viagra 100mg
    effects of viagra blog – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  13. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Tips effectively applied!.

    viagra for her global systems viagra
    viagra without a doctor prescription
    compra viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  14. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you! I value this!

    new song called viva viagra other viagra
    generic viagra 100mg
    gloria viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  15. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Helpful information. Thank you!

    viagra experience stories viagra sample free
    cheap viagra
    viagra for multible climaxes – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  16. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks, A good amount of tips.

    spanish viagra pfizer viagra fda approval 2009
    generic viagra online
    viagra caddis fly pattern – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  17. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos, Terrific information!

    multiple erections on viagra passion viagra
    buy generic viagra
    where can i order generic viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  18. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Terrific stuff.

    viagra cheap northwest generic viagra kamagra caverta pillshoprxcom
    viagra without a doctors prescription
    viagra safty – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  19. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos. Quite a lot of tips!

    fruit benefits similar to viagra viagra boosts post cuddle chemical
    viagra online
    viagra generica – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  20. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards! A lot of stuff.

    viagra increases blood pressure viagra 50 mg side effects
    generic viagra online
    viagra edinburgh search find pages sites – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  21. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You suggested this adequately.

    sex pill industry viagra viagra real mail
    viagra without a doctor prescription
    viagra awful – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  22. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Many thanks!

    novocaine interacting with viagra risks blood clots viagra medline
    viagra without a doctors prescription
    viagra 50m – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  23. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos, Good stuff.

    viagra and indegistion viagra shelflife
    buy generic viagra
    celebrity endorsments viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  24. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Thank you!

    edinburgh viagra tid search charles viagra no prescription cheap
    viagra online
    i want to buy viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  25. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    With thanks. I like this!

    lisonpril viagra viagra and nasal problems
    generic viagra
    roy mercer viagra – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  26. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually explained that exceptionally well.

    colleagues viagra how much is a viagra overdose
    generic viagra 100mg
    viagra vs viagra professional – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  27. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Useful content. Many thanks!

    viagra marketing director viagra lawsuit updates in march 2009
    cheap viagra
    viagra free sites computer news – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  28. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Helpful information. Many thanks.

    adipex meridia online phentermine prescription viagra viagra phizer
    viagra for sale uk
    glucophage viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  29. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards. Valuable stuff!

    viagra chemistry boost as viagra
    generic viagra
    viagra online cheap – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  30. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Awesome facts. Thanks a lot!

    viagra stories blogs medicaid viagra
    generic viagra
    viagra no prescription online cheap – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  31. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wow loads of amazing advice!

    viagra cialis levitra online rxmeds free viagra samples online
    buy viagra
    herbal viagra alternatives – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  32. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Tips effectively utilized..

    united states sellers of viagra viagra how much
    viagra generic
    viagra de ke esta echa – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  33. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Good info, Regards.

    lloyds internet sales viagra mccain viagra commercial
    viagra without a doctors prescription
    viagra tv commericals – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  34. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    With thanks! A lot of forum posts!

    long term side efects of viagra best price viagra name brand
    buy viagra
    travis chimp viagra – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  35. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You expressed it fantastically.

    dithiazide and viagra viagra hard on
    generic viagra
    viagra overnight delivery on weekends – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  36. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Awesome information, Kudos!

    women who like men taking viagra us patent viagra
    buy viagra
    viagra for fun – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  37. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Reliable tips. With thanks.

    viagra plus something else effects of viagra blog
    buy viagra
    discount viagra the usa – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  38. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually revealed this really well.

    viagra plus dirrections for use of viagra
    viagra generic
    ogden viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  39. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Very good information. Regards.

    natural viagra herbs cozaar and viagra
    generic viagra 100mg
    viagra home made – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  40. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    This is nicely put. !

    price of viagra in mexico buy cheap viagra 32
    viagra for women
    cost of viagra in the pi – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  41. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Really quite a lot of great knowledge!

    cialis viagra paypal online viagra authentic
    generic viagra 100mg
    viagra lavitra – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  42. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Incredible loads of valuable advice!

    buy chinese herbal viagra duro legitimate suppliers of viagra australia
    viagra 100mg
    cost viagra cialis – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  43. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Whoa all kinds of useful info.

    viagra trial size free viagra for sale
    viagra for sale uk
    edinburgh viagra search linskaill charles – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  44. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually mentioned it perfectly.

    viagra fuerteventura buy kamagra viagra
    generic viagra 100mg
    viagra demonstrate – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  45. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Kudos!

    viagra overnite shipping las vegas kamagra viagra about
    viagra generic
    where to order cheap viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  46. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards, A good amount of data.

    generic link viagra com zenegra mix epinephrine and viagra
    viagra without a doctor prescription
    limbaugh viagra dominican republic – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  47. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks, Ample postings!

    how safe is viagra from canada bob dole viagra ad
    viagra generic
    how much is a viagra overdose – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  48. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Good tips. With thanks.

    viagra gel buy viagra soft online
    generic viagra online
    canida viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  49. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wow many of fantastic info!

    viagra recreational walgreens viagra
    buy generic viagra
    over the counter viagra in holland – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  50. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Incredible all kinds of superb tips.

    subaction showcomments viagra smyle older best source for viagra
    generic viagra
    free sites results computer viagra find – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  51. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Truly many of helpful facts.

    online prescription viagra viagra and oxycontin
    generic viagra 100mg
    free coupons viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  52. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wonderful facts, Thanks!

    viagra kamagra uk erectalis cheapest price viagra deliverd uk
    viagra without a doctors prescription
    best instructions for taking generic viagra – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  53. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Reliable information. Thanks.

    best way to buy viagra chopping viagra
    viagra for sale uk
    herbal viagra fda – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  54. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Cheers. Quite a lot of advice.

    viagra generic us viagra for doggies
    viagra generic
    viagra vitamin c – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  55. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wow a good deal of helpful information.

    soft viagra instructions walmart female viagra
    viagra online
    viagra and pulmonary hypertension canine – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  56. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually mentioned this very well!

    viagra heart racing non ed benefit of viagra
    buy viagra
    fake viagra at starship shops – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  57. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You made the point.

    cheap viagra sales viagra forums
    viagra for women
    viagra cialis bu safe paypal – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  58. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Helpful posts. Cheers!

    how does dilitiazem interact with viagra long term effects using viagra
    viagra without a doctor prescription
    quick forum readtopic viagra answer content – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  59. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Fantastic stuff!

    viagra brands sites charles linskaill find viagra alerts
    viagra pills
    mark martin viagra car – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  60. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Very good write ups. With thanks.

    viagra soft tabs cheap viagra over the counter substitute
    generic viagra 100mg
    viagra being prescribed for inmate – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  61. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put, Cheers!

    whats i n viagra does viagra effect eye site
    generic viagra
    viagra old effects of pill – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  62. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You said it very well.!

    how does viagra cause blindness viagra soft tabs
    viagra online
    how long will viagra last – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  63. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you. I enjoy this.

    viagra and brain tumors buy cheap online viagra
    viagra for sale uk
    viagra 125 mg – https://genericviagramsl.com

    DavidOnefe
    Terenceret
    Victorpof

  64. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Valuable information!

    photo proof viagra works watermelon rhine natural viagra
    viagra pills
    compare viagra levitron cialis – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

  65. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Truly loads of beneficial tips!

    viagra ice cream viagra effects on woman
    viagra without a doctors prescription
    medicare advantage programs covering viagra – https://genericviagrantx.com

    DavidOnefe
    Terenceret
    Victorpof

  66. AndrewEndUg says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Effectively expressed genuinely. .

    is viagra otc in peru viagra equivalent herbal tablets
    generic viagra 100mg
    buy phentermine viagra – https://genericviagrarcp.com

    DavidOnefe
    Terenceret
    Victorpof

Leave a Reply

Your email address will not be published. Required fields are marked *