So you have two shiny new devices say one is a media server and the other is a TV. Both have stamped on them the letters DLNA. You know that DLNA is a standard for media transmission between devices (before Dr Flick jumps on me – I KNOW I am over simplifying greatly.) You would expect media from your server to play on your TV – wouldn’t you? Well perhaps.
The issue here is that it is only going to work if your shiny TV supports the same codecs (Video standards) as your equally shiny media server and that can be frustratingly unlikely.
If you stick to one eco-sphere of media it might work. For example Windows PCs stream pretty well to Xboxes. Yet even with these close siblings there can be frustrations and step over to say Apple’s world and try to stream Windows Media then you are in for a tough time. I haven’t found an iPad DLNA client yet that can play Windows Media Video.
The problem here is not just that it doesn’t always work but the fact that it is perceived as a standard that should just work and by not working it is dragging down the perception of the convenience of the whole connected digital lifestyle.
So how to fix this. Whilst some manufacturers have done great things with their Media Renderers (the play back device) that only really applies to devices with some processing grunt. For example I have never managed to throw something at the PS3 DLNA client it could not play. I think it is unreasonable to expect the playback devices to solve this issue – getting a phone to transcode on the fly from a standard it cannot play to one can is likely to grind the phone to a halt, although some Windows Phone 7 devices might cope. I think the way forward is with the servers. We need the ability to transcoding servers that can provide what the client CAN play.
Now this isn’t likely to happen for many of the existing media servers out there. So I think there is gap in the market for what I call a DLNA recoder this is something that would act as an intermediary between a server and a renderer client. Basically the renderer would see the recoder box as a server and the server would see it as a client. The recoder would interrogate the server and list all the content to the client but marking them to be in a format that the client could play. When the client requests media from the recoder will request the same media from the server but in a format the server can serve. The recoder will then transcode that media on fly into the format the client understands and stream it. Now I haven’t read the full DLNA standard and there may be something in the specs to cover this – I am sure Dr Flick will jump in if there is – but I haven’t seen a device that does this yet and I know I would buy one and I am sure others would too. I would equally be happy with something that ran on my Media Center to do this – I have seen some DLNA server software that claim to almost do this but I have not yet seen anything truly succeed yet.
Hopefully if DLNA server manufacturers got their act together then over time the need for such recoders would disappear but until that day I think they would make a lot of Digital Lifestyles a lot easier.
0 thoughts on “Op Ed: DLNA – A frustrating standard”
Comment Dr Flick sent me:
Garry,
This should work, but we all know how that goes…..
The UPnP/DLNA architecture is designed so that the ConnectionManager does a GetProtocolInfo() against the MediaServer to find out the format of the content. It then performs a GetProtocolInfo() action against the MediaRenderer and a list of transfer protocols and data formats supported by the MediaRenderer is returned and used to determine that the MediaRenderer can play that format (or one of the formats available for that Content Item). The protocol/format information returned by the ContentDirectory service for the desired content is matched with the protocol/format information returned by the MediaRenderer’s ConnectionManager::GetProtocolInfo() action and passed to the Control Point. The Control Point then selects a transfer protocol and data format that is supported by both the MediaServer and MediaRenderer for that connection’s Instance ID. Of course, that is in a perfect world.
There are three primary caveats with this process.
· One is if the content is protected. There is additional functionality to determine the DRM scheme and if it is supported by the MediaRenderer. There is not a requirement to support all possible DRM schemes, so the content may not play at all.
· Another related issue is if the Control Point is based upon an older version of the spec. There actually are four fields returned with GetProtocolInfo. Some older Control Points do not read the fourth field of the ProtocolInfo string, which is where the DRM type is defined (the third and fourth fields really need to match to ensure interoperability). The older Control Point may not know that the MediaRenderer cannot play the content, will try, and then it fails. Additionally, there are some parameters that have been updated with the newer versions related to the MIME type definitions, which also may influence the ability to match the protocols/data formats correctly. This is yet another reason why companies like Microsoft specify the DLNA Version 1.5 or newer for their infrastructure to operate properly.
· More to your point, the big issue is codecs (or Formats in DLNA lingo). Many devices don’t support more than the minimum required Formats. In fact, if the device is not certified, it may not even support the required minimum Formats.
The following formats are the minimum required:
VIDEO
MPEG-1
MPEG-2
H.263
MPEG-4 Part 2
MPEG-4 Part 10
WMV9
VC-1
AUDIO
LPCM
MPEG-1/2 L2
MPEG-1/2 L3
MPEG-4 AAC LC
MPEG-4 AAC LTP
MPEG-4 HE AAC
MPEH-4 BSAC
AC-3
ATRAC3plus
WMA
WMA Professional
AMR
AMR-WB+
G.726
IMAGES
JPEG
PNG
GIF
TIFF
Note that there also are different required Profiles for the content, which can be geographically oriented. Different content is formatted differently depending upon the country in which it was rendered or is being played. There also are various bit rates available for different Profiles (and Formats), which complicates things even further. DLNA specifies is a list of minimum Profile requirements that define the bits rates that a MediaRenderer must support to be certified. Microsoft also has extended these Profiles for the Windows Media platform.
You also do not mention that there are different requirements for Mobile DLNA-based devices (DLNA Device Classes). The requirements for a Mobile Digital Media Server (M-DMS) and Mobile Digital Media Player (M-DMP) are different than their non-mobile counterparts.
I guess, lastly, is that some MediaServers also have the ability to transcode the content as part of streaming it to the MediaRenderer (many on-the-fly). This seems like an area where your idea of a “middle man” would work the best. Microsoft has put some effort into this transcoding process (probably because of the horsepower most PCs have available for doing this, especially with the ability to offload this to the graphics processor) for at least the Windows Media formats they support. Not all MediaServers have this capability.
Keep in mind you also are talking about Apple-based products. Is anything Apple actually DLNA certified? Also, note that being DLNA “compliant” may be different than being DLNA “certified” for many of these software-based solutions. User/implementer beware, as you have seen.
{"id":null,"mode":"button","open_style":"in_place","currency_code":"GBP","currency_symbol":"\u00a3","currency_type":"decimal","blank_flag_url":"https:\/\/thedigitallifestyle.com\/w\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/thedigitallifestyle.com\/w\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":500,"top_media_type":"none","featured_image_url":false,"featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Leave a tip","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"TheDigitalLifestyle.com","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"TheDigitalLifestyle.com","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for being a supporter!","payment_confirmation_title":"TheDigitalLifestyle.com","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Comment Dr Flick sent me:
Garry,
This should work, but we all know how that goes…..
The UPnP/DLNA architecture is designed so that the ConnectionManager does a GetProtocolInfo() against the MediaServer to find out the format of the content. It then performs a GetProtocolInfo() action against the MediaRenderer and a list of transfer protocols and data formats supported by the MediaRenderer is returned and used to determine that the MediaRenderer can play that format (or one of the formats available for that Content Item). The protocol/format information returned by the ContentDirectory service for the desired content is matched with the protocol/format information returned by the MediaRenderer’s ConnectionManager::GetProtocolInfo() action and passed to the Control Point. The Control Point then selects a transfer protocol and data format that is supported by both the MediaServer and MediaRenderer for that connection’s Instance ID. Of course, that is in a perfect world.
There are three primary caveats with this process.
· One is if the content is protected. There is additional functionality to determine the DRM scheme and if it is supported by the MediaRenderer. There is not a requirement to support all possible DRM schemes, so the content may not play at all.
· Another related issue is if the Control Point is based upon an older version of the spec. There actually are four fields returned with GetProtocolInfo. Some older Control Points do not read the fourth field of the ProtocolInfo string, which is where the DRM type is defined (the third and fourth fields really need to match to ensure interoperability). The older Control Point may not know that the MediaRenderer cannot play the content, will try, and then it fails. Additionally, there are some parameters that have been updated with the newer versions related to the MIME type definitions, which also may influence the ability to match the protocols/data formats correctly. This is yet another reason why companies like Microsoft specify the DLNA Version 1.5 or newer for their infrastructure to operate properly.
· More to your point, the big issue is codecs (or Formats in DLNA lingo). Many devices don’t support more than the minimum required Formats. In fact, if the device is not certified, it may not even support the required minimum Formats.
The following formats are the minimum required:
VIDEO
MPEG-1
MPEG-2
H.263
MPEG-4 Part 2
MPEG-4 Part 10
WMV9
VC-1
AUDIO
LPCM
MPEG-1/2 L2
MPEG-1/2 L3
MPEG-4 AAC LC
MPEG-4 AAC LTP
MPEG-4 HE AAC
MPEH-4 BSAC
AC-3
ATRAC3plus
WMA
WMA Professional
AMR
AMR-WB+
G.726
IMAGES
JPEG
PNG
GIF
TIFF
Note that there also are different required Profiles for the content, which can be geographically oriented. Different content is formatted differently depending upon the country in which it was rendered or is being played. There also are various bit rates available for different Profiles (and Formats), which complicates things even further. DLNA specifies is a list of minimum Profile requirements that define the bits rates that a MediaRenderer must support to be certified. Microsoft also has extended these Profiles for the Windows Media platform.
You also do not mention that there are different requirements for Mobile DLNA-based devices (DLNA Device Classes). The requirements for a Mobile Digital Media Server (M-DMS) and Mobile Digital Media Player (M-DMP) are different than their non-mobile counterparts.
I guess, lastly, is that some MediaServers also have the ability to transcode the content as part of streaming it to the MediaRenderer (many on-the-fly). This seems like an area where your idea of a “middle man” would work the best. Microsoft has put some effort into this transcoding process (probably because of the horsepower most PCs have available for doing this, especially with the ability to offload this to the graphics processor) for at least the Windows Media formats they support. Not all MediaServers have this capability.
Keep in mind you also are talking about Apple-based products. Is anything Apple actually DLNA certified? Also, note that being DLNA “compliant” may be different than being DLNA “certified” for many of these software-based solutions. User/implementer beware, as you have seen.
=D-