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. LucasNeS says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Awesome forum posts. Thank you.
    https://www.visitwaushara.com/
    online pharmacies
    canada pharmaceuticals online
    overseas pharmacies
    canada pharmaceuticals online

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

    Nicely expressed genuinely. !
    https://www.waltcoexpress.com/
    canada pharmacy no prescription
    canadian pharmacies that ship to us
    prescription drug assistance
    aarp approved canadian online pharmacies

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

    Amazing lots of beneficial information!
    https://www.interlandchemie.com/
    mail order pharmacies
    canada pharmaceutical online ordering
    canadian rx pharmacy online
    canada pharmaceuticals online

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

    Really loads of helpful advice!
    https://www.lunarciel.com/
    overseas pharmacies
    canada drug
    best online pharmacies no prescription
    top rated canadian pharmacies online

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

    Nicely put. With thanks!
    https://www.lunarciel.com/
    canadian pharmacies without prescriptions
    canada pharmacy
    canadian prescriptions
    canada drugs

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

    Thank you. Loads of material.

    https://www.lunarciel.com/
    mexican pharmacies shipping to usa
    canadian pharmacies without an rx
    pharmacy price comparison
    canadian viagra

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

    Many thanks. Quite a lot of information.

    https://www.lunarciel.com/
    get prescription online
    aarp approved canadian online pharmacies
    pharmacy online mexico
    global pharmacy canada

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

    Nicely put. Regards.
    https://www.visitwaushara.com/
    canadadrugs.com pharmacy
    trust pharmacy canada
    buy prescription drugs online
    canadian pharmacy online

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

    You said this fantastically.
    https://www.interlandchemie.com/
    trust pharmacy canada
    canada pharmaceutical online ordering
    cheap prescription drugs
    canada pharmacy

  11. LucasNeS 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!

    https://www.interlandchemie.com/
    no prior prescription required pharmacy
    canadian pharmacies that ship to us
    no prior prescription required pharmacy
    canada drugs online

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

    Kudos! Ample knowledge!

    https://www.visitwaushara.com/
    pharmacy cost comparison
    top rated canadian pharmacies online
    pharmacies in canada
    canada online pharmacies

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

    Nicely put. Regards.
    https://www.interlandchemie.com/
    cheap prescription drugs
    north west pharmacy canada
    canadian pharmacy online canada
    mexican pharmacies shipping to usa

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

    Useful forum posts. Appreciate it.
    https://www.visitwaushara.com/
    northwest pharmacy canada
    canadian pharmacies without an rx
    pharmacy near me
    canadian pharmacies

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

    Nicely put, Cheers!
    https://www.visitwaushara.com/
    pharmacy drug store
    online pharmacies canada
    canada drugs online
    canadian pharmacy online

  16. LucasNeS 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 this!
    https://www.interlandchemie.com/
    rx online
    trust pharmacy canada
    pharmacy online
    mexican pharmacies shipping to usa

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

    Thanks. A good amount of write ups!

    https://www.waltcoexpress.com/
    canadian pharmacy no prescription needed
    top rated canadian pharmacies online
    cheap prescription drugs
    canada pharmaceuticals online

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

    Many thanks! I enjoy it.
    https://www.waltcoexpress.com/
    canadian prescription
    canada drug
    online drugs
    northwest pharmacy

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

    Many thanks! Lots of information!

    https://www.lunarciel.com/
    best canadian pharmacies
    canada drugs
    price prescription drugs
    canadian pharcharmy

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

    Amazing lots of useful data.
    https://www.dunamisproductions.com/
    canadian pharmacies shipping to usa
    top rated canadian pharmacies online
    meds online
    canada pharmacy online

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

    Thanks. Excellent stuff.
    https://www.lunarciel.com/
    costco pharmacy pricing
    canadian pharmacies online
    canadian pharmacy 365
    global pharmacy canada

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

    You actually reported this well.
    https://www.lunarciel.com/
    canadian online pharmacies
    canadian pharmacies that ship to us
    24 hour pharmacy
    canadian pharmacies that ship to us

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

    Information clearly taken..
    https://www.interlandchemie.com/
    best online international pharmacies
    canadian viagra
    canadian pharmacy
    canadian drugs

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

    You actually explained it wonderfully.
    https://www.visitwaushara.com/
    canadian drugs without prescription
    canada pharmaceuticals online
    canadian drugs
    canada drugs online

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

    Kudos! Loads of information.

    https://www.dunamisproductions.com/
    canadian drugstore reviews
    canadian pharcharmy
    get prescription online
    canada pharmaceuticals online

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

    Great forum posts, Kudos!
    https://www.visitwaushara.com/
    online pharmacy usa
    northwest pharmacy
    prescription drugs online without doctor
    canadianpharmacy

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

    With thanks, Numerous tips!

    https://www.lunarciel.com/
    drug prices comparison
    mexican pharmacies shipping to usa
    best online pharmacies no prescription
    canadian viagra

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

    Fantastic tips. Kudos!
    https://www.dunamisproductions.com/
    canadian pharmacy no prescription needed
    canadian online pharmacy
    drugs from canada
    canada pharmaceutical online ordering

  29. LucasNeS 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 content!

    https://www.visitwaushara.com/
    canada pharmacies prescription drugs
    canada online pharmacies
    best online pharmacies canada
    canadian pharmacies-24h

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

    Really a good deal of wonderful facts.
    https://www.lunarciel.com/
    canadian online pharmacies
    trust pharmacy canada
    king pharmacy
    canada pharmaceuticals online

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

    This is nicely said. .
    https://www.dunamisproductions.com/
    ed meds online
    canada pharmaceutical online ordering
    overseas pharmacies
    canadianpharmacy

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

    Nicely put. With thanks.
    https://www.visitwaushara.com/
    canada pharmacies online pharmacy
    canadianpharmacy
    canadian pharmacy no prescription
    canadian pharmaceuticals online

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

    Truly a lot of beneficial info!
    https://www.waltcoexpress.com/
    canadian online pharmacy reviews
    canadian drugs
    canadian pharmacy reviews
    canadian pharmacies-24h

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

    Truly all kinds of helpful knowledge.
    https://www.interlandchemie.com/
    buy prescription drugs from canada
    canadian pharmacies without an rx
    canadian prescription drugs
    north west pharmacy canada

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

    Beneficial stuff. Kudos.
    https://www.dunamisproductions.com/
    canadian drugs
    canada pharmacy
    online pharmacy
    canadian online pharmacies

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

    Helpful postings. Cheers.
    https://www.visitwaushara.com/
    canadapharmacy
    northwest pharmacy
    canadian meds
    canadian drugs

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

    Wow many of beneficial material.
    https://www.waltcoexpress.com/
    online pharmacy reviews
    top rated canadian pharmacies online
    online canadian pharcharmy
    canadian pharmacy online

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

    Kudos. Lots of facts!

    https://www.waltcoexpress.com/
    online pharmacy without a prescription
    online pharmacies of canada
    drugs online
    canadian cialis

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

    Perfectly expressed truly! !
    https://www.visitwaushara.com/
    canadian pharmacies without prescriptions
    canada drug
    prescription online
    canadian pharmacy

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

    Excellent material. Thanks a lot!
    https://www.waltcoexpress.com/
    mexican pharmacy online medications
    canada pharmaceutical online ordering
    online pharmacy without a prescription
    canada pharmaceuticals online

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

    Truly plenty of amazing knowledge!
    https://www.lunarciel.com/
    walmart pharmacy price check
    canada online pharmacies
    pharmacy prices
    canadian pharmacies-24h

  42. LucasNeS 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!
    https://www.visitwaushara.com/
    prescription cost comparison
    north west pharmacy canada
    online pharmacy canada
    top rated canadian pharmacies online

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

    You’ve made your position extremely well.!
    https://www.waltcoexpress.com/
    no 1 canadian pharcharmy online
    canada drug
    meds online
    canadian pharmacies

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

    Factor effectively regarded!.
    https://www.dunamisproductions.com/
    compare prescription prices
    northwest pharmacy
    canada drug pharmacy
    canadian pharmacy

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

    With thanks. Numerous knowledge!

    https://www.lunarciel.com/
    canada meds
    canadian online pharmacy
    pharmacy prices compare
    global pharmacy canada

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

    You definitely made the point!
    https://www.waltcoexpress.com/
    prescription cost comparison
    canada pharmaceuticals online
    prescription drugs without prior prescription
    canadian cialis

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

    Many thanks. A lot of write ups!

    https://www.dunamisproductions.com/
    costco pharmacy pricing
    canada drugs
    pharmacy online mexico
    online pharmacies of canada

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

    This is nicely said! !
    https://www.waltcoexpress.com/
    prescription drugs canada
    trust pharmacy canada
    canadian pharmacy no prescription
    top rated canadian pharmacies online

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

    Appreciate it. Loads of stuff.

    https://www.waltcoexpress.com/
    canadian pharmacy online canada
    northwest pharmacy
    discount drugs online pharmacy
    canada online pharmacies

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

    Cheers, A lot of material.

    https://www.interlandchemie.com/
    canada drugs online
    canada pharmacy online
    canada pharmacies online pharmacy
    canadian pharmacies online

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

    Point well used..
    https://www.visitwaushara.com/
    rx online
    canadian pharmacies online
    online drugs
    canadian online pharmacy

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

    Nicely put, With thanks.
    https://www.visitwaushara.com/
    legitimate canadian mail order pharmacies
    trust pharmacy canada
    canada meds
    trust pharmacy canada

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

    You mentioned it adequately.
    https://www.dunamisproductions.com/
    prescription drug cost
    mexican pharmacies shipping to usa
    canadapharmacyonline com
    canadian drugs

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

    Thanks, Useful stuff!
    https://www.interlandchemie.com/
    onlinecanadianpharmacy.com
    global pharmacy canada
    canadian drug
    canadian online pharmacy

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

    You actually expressed this perfectly!
    https://www.waltcoexpress.com/
    drugs online
    canadian online pharmacies
    canadian drug store
    london drugs canada

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

    You said it nicely.!
    https://www.lunarciel.com/
    canada pharmacy
    canada drug
    medication costs
    canada drug

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

    This is nicely said! !
    https://www.waltcoexpress.com/
    prescription drugs without prior prescription
    canadian viagra
    canadapharmacy com
    canadian viagra

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

    Useful info. Cheers!
    https://www.visitwaushara.com/
    visit poster’s website
    canadian online pharmacies
    canada pharmacy online reviews
    canadian pharmacies without an rx

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

    Tips very well applied.!
    https://www.interlandchemie.com/
    northwest pharmacy
    north west pharmacy canada
    best online international pharmacies
    canadian viagra

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

    Superb data, Thanks a lot!
    https://www.waltcoexpress.com/
    rx price comparison
    canadian pharmacy online
    rx online
    canada drugs

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

    Wow tons of helpful information.
    https://www.interlandchemie.com/
    prescription price comparison
    trust pharmacy canada
    canadian rx pharmacy online
    canada online pharmacies

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

    Thanks, Ample posts.

    https://www.interlandchemie.com/
    canada drug
    canadian drugs
    canadian pharmacy without prescription
    canada pharmacy

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

    Helpful data. With thanks.
    https://www.interlandchemie.com/
    canadian drug stores online
    canadian pharmacies-24h
    canada pharmacy online
    canadian pharmacies online

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

    Thanks a lot, A lot of posts!

    https://www.visitwaushara.com/
    get prescription online
    top rated canadian pharmacies online
    prescription drugs canada
    canadian pharmacies-24h

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

    Excellent advice. Regards.
    https://www.waltcoexpress.com/
    canada online pharmacy
    canada drugs
    buying prescription drugs canada
    canadian pharmacies online

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

    Truly plenty of helpful information!
    https://www.visitwaushara.com/
    walgreens pharmacy
    online pharmacies of canada
    online pharmacy no prescription needed
    canada pharmacy

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

    Really a lot of great information.
    http://canadianpharmaciesnnm.com/
    canadapharmacyonline com
    north west pharmacy canada
    online canadian pharcharmy
    canadian pharmacies without an rx

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

    You definitely made the point!
    http://talahicc.com/
    northwest pharmacy canada
    online pharmacies canada
    canada drugs online pharmacy
    canadian drugs

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

    Truly a lot of helpful advice!
    http://www.canadianpharmacymsn.com/
    drugs without prescription
    canadian online pharmacies
    us pharmacy no prior prescription
    canadian pharcharmy

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

    Thank you. Excellent stuff!
    http://canadianpharmaciescubarx.com/
    online pharmacies no prescription
    canadian drugs
    canada drug
    canada drugs

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

    Thank you, I appreciate this!
    http://canadianpharmacysilo.com/
    pharmacy online mexico
    global pharmacy canada
    mexican pharmacies shipping to usa
    canada pharmaceuticals online

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

    Appreciate it, Numerous info!

    http://talahicc.com/
    visit poster’s website
    canadian online pharmacy
    drug prices comparison
    canadian pharmacy online

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

    Thanks! Loads of advice.

    http://talahicc.com/
    buying prescription drugs canada
    top rated canadian pharmacies online
    cheap prescription drugs online
    canadian pharmacies online

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

    Cheers. Excellent information!
    http://canadianpharmacyntx.com/
    online pharmacies no prescription
    northwestpharmacy
    online drugstore
    northwest pharmacy

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

    Thanks a lot. Terrific stuff!
    http://canadianpharmaciesnnm.com/
    canada online pharmacies
    global pharmacy canada
    online pharmacy without a prescription
    canadian pharmacies-24h

Leave a Reply

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