Current.FeelsLike
Current.UVIndex
Current.DewPoint
-Current.OutlookIcon
+Current.ConditionIcon
Current.FanartCode
CURRENT
-------
Current.IsFetched
+Current.LocalTime
+Current.LocalDate
Current.WindDegree
Current.SolarRadiation
Current.Pressure
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="weather.wunderground" name="Weather Underground" version="1.0.9" provider-name="Team XBMC">
+<addon id="weather.wunderground" name="Weather Underground" version="1.0.15" provider-name="Team XBMC">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.simplejson" version="2.0.10"/>
<extension point="xbmc.python.module" library="resources/lib/wunderground"/>
<extension point="xbmc.addon.metadata">
<summary lang="af">Weer voorspelling vanaf wunderground.com</summary>
+ <summary lang="am">የአየር ንብረት ከ wunderground.com</summary>
<summary lang="ar">توقعات الطقس من wunderground.com</summary>
<summary lang="be">Прагноз надвор'я з wunderground.com</summary>
<summary lang="bg">Синоптична прогноза от wunderground.com</summary>
- <summary lang="ca">Previsió del temps des de wunderground.com</summary>
+ <summary lang="ca">Previsió del temps de wunderground.com</summary>
<summary lang="cs">Předpověď počasí z wunderground.com</summary>
+ <summary lang="cy">Rhagolygon tywydd gan wunderground.com</summary>
<summary lang="da">Vejrudsigt fra wunderground.com</summary>
<summary lang="de">Wettervorhersage von wunderground.com</summary>
<summary lang="el">Πρόγνωση καιρού από το wunderground.com</summary>
<summary lang="et">Ilmaennustus portaalist wunderground.com</summary>
<summary lang="eu">Eguraldi iragarpena wunderground.com-etik</summary>
<summary lang="fi">Sääennusteet wunderground.com-sivustolta</summary>
+ <summary lang="fo">Veðurlíkindi frá wunderground.com</summary>
<summary lang="fr">Prévisions météo fournies par wunderground.com</summary>
<summary lang="gl">Predición meteorolóxica de wunderground.com</summary>
<summary lang="he">תחזית מזג האויר מאת wunderground.com</summary>
- <summary lang="hr">Prognoza vremena od wunderground.com</summary>
+ <summary lang="hr">Prognoza vremena s wunderground.com</summary>
<summary lang="hu">Időjárás előrejelzés a wunderground.com-tól</summary>
<summary lang="is">Veðurspár frá wunderground.com</summary>
<summary lang="it">Meteo fornito da wunderground.com</summary>
<summary lang="ko">wunderground.com 날씨예보</summary>
<summary lang="lt">Orų prognozė nuo/iš wunderground.com</summary>
<summary lang="mk">Временска прогноза од wunderground.com</summary>
+ <summary lang="my">wunderground.com မှ ရာသီဥတုခန့်မှန်းချက်</summary>
<summary lang="nl">Weersvoorspelling van wunderground.com</summary>
<summary lang="no">Værvarsel fra wunderground.com</summary>
<summary lang="pl">Prognoza pogody ze strony wunderground.com</summary>
<summary lang="ru">Прогноз погоды с сайта wunderground.com</summary>
<summary lang="sk">Predpoveď počasia z wunderground.com</summary>
<summary lang="sl">Vremenska napoved, ki jo zagotavlja wunderground.com</summary>
+ <summary lang="sq">Parashikimi i motit nga wunderground.com</summary>
<summary lang="sv">Väderprognos från wunderground.com</summary>
+ <summary lang="ta_IN">Wunderground.com இருந்து வானிலை முன்னறிவிப்பு</summary>
<summary lang="th">พยากรณ์อากาศจาก wunderground.com</summary>
<summary lang="tr">Hava durumu wunderground.com sitesinden alınır</summary>
<summary lang="uk">Прогноз погоди з wunderground.com</summary>
+ <summary lang="uz">wunderground.com dan ob-havo ma'lumoti</summary>
+ <summary lang="vi">Dự báo thời tiết từ wunderground.com</summary>
<summary lang="zh">来自wunderground.com的天气预报</summary>
<summary lang="zh_TW">weatherground.com 上的天氣預報</summary>
<description lang="af">Weer voorspelling verskaf deur Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="am">የአየር ንብረት የሚቀርበው በ Weather Underground (http://www.wunderground.com/)</description>
<description lang="ar">توقعات الطقس من تقديم Weather Underground (http://www.wunderground.com/)</description>
<description lang="be">Прагноз надвор'я створаны Weather Underground (http://www.wunderground.com/)</description>
<description lang="bg">Синоптична прогноза с данните от Weather Underground (http://www.wunderground.com/)</description>
<description lang="ca">Previsió del temps proporcionada per Weather Underground (http://www.wunderground.com/)</description>
<description lang="cs">Předpověď počasí poskytnuta stránkou Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="cy">Rhagolygon tywydd gan Weather Underground (http://www.wunderground.com/)</description>
<description lang="da">Vejrudsigten leveres af Weather Underground (http://www.wunderground.com/)</description>
<description lang="de">Wettervorhersage bereitgestellt durch Weather Underground (http://www.wunderground.com/)</description>
<description lang="el">Η πρόγνωση καιρού παρέχεται από το Weather Underground (http://www.wunderground.com/)</description>
<description lang="es_MX">Pronóstico del tiempo por Weather Underground (http://www.wunderground.com/)</description>
<description lang="et">Ilma ennustab Weather Underground (http://www.wunderground.com/)</description>
<description lang="fi">Sääennusteet Weather Underground -sivuston tarjoamina (http://www.wunderground.com/)</description>
+ <description lang="fo">Veðurlíkindi eru veitt av Weather Underground (http://www.wunderground.com)</description>
<description lang="fr">Prévisions météo fournies par Weather Underground (http://www.wunderground.com/)</description>
<description lang="gl">Predición meteorolóxica provista por Weather Underground (http://www.wunderground.com/)</description>
<description lang="he">תחזית מזג האויר ניתנת ע"י Weather Underground (http://www.wunderground.com</description>
<description lang="ko">Weather Underground (http://www.wunderground.com/)가 제공하는 날씨예보</description>
<description lang="lt">Orų prognozė teikiama (pateikiama) iš Weather Underground (http://www.wunderground.com/)</description>
<description lang="mk">Временска прогноза обезбедена од Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="my">ရာသီဥတုခန့်မှန်းချက်ကို Weather Underground (http://www.wunderground.com/) မှထောက်ပံ့ပေးထားပါသည်။</description>
<description lang="nl">Weersvoorspelling voorzien door Weather Underground (http://www.wunderground.com/)</description>
<description lang="no">Værvarsel fra Weather Underground (http://www.wunderground.com)</description>
<description lang="pl">Prognoza pogody jest dostarczona dzięki uprzejmości serwisu: (http://www.wunderground.com/)</description>
<description lang="ru">Прогноз погоды предоставлен компанией Weather Underground (http://www.wunderground.com/)</description>
<description lang="sk">Predpoveď počasia poskytovaná od Weather Underground (http://www.wunderground.com/)</description>
<description lang="sl">Vremenska napoved, ki jo zagotavlja Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="sq">Parashikimi i motit i pajisur nga Weahter Underground (http://www.wunderground.com/)</description>
<description lang="sv">Väderprognos tillhandahållen av Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="ta_IN">வானிலை முன்னறிவிப்பு வழங்குபவர் வானிலை அண்டர்கிரவுண்டு (http://www.wunderground.com/)</description>
<description lang="th">พยากรณ์อากาศโดย Weather Underground (http://www.wunderground.com/)</description>
<description lang="tr">Hava Durumu Weather Underground tarafından sağlanır (http://www.wunderground.com/)</description>
<description lang="uk">Прогноз погоди надано Weather Underground (http://www.wunderground.com/)</description>
+ <description lang="uz">Ob-havo ma'lumoti Weather Underground (http://www.wunderground.com/) tomonidan taqdim etilgan</description>
+ <description lang="vi">Dự báo thời tiết từ Weather Underground (http://www.wunderground.com/)</description>
<description lang="zh">由Weather Underground(http://www.wunderground.com/)提供的天气预报</description>
<description lang="zh_TW">天氣預報由 Weather Underground (http://www.wunderground.com/) 所提供</description>
<disclaimer lang="af">Die gebruik van hierdie byvoegsel impliseer dat U saamstem met die Terme van Diens uiteengesit op http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="bg">Употребявайки добавката Вие се съгласявате с условията за ползване на услугата, които се намират на http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="ca">L'ús d'aquest complement implica que vostè ha acceptat els termes de servei ubicats a http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="cs">Používáním tohoto rozšíření schvalujete podmínky užívání umístěné na http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
- <disclaimer lang="da">Brug af denne add-on indebærer, at du har erklæret dig enig i vilkårene for tjenesten, der findes på http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="cy">Mae defnyddio'r ategyn yma'n awgrymu eich bod yn cytuno i'r Amodau Gwasanaeth sydd yn http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="da">Brug af denne addon indebærer, at du har erklæret dig enig i vilkårene for tjenesten, der findes på http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="de">Mit Benutzung dieses Addons bestätigen Sie, dass Sie den Nutzungsbedingungen auf http://www.wunderground.com/weather/api/d/terms.html zustimmen.</disclaimer>
<disclaimer lang="el">Χρήση αυτού του πρόσθετου συνεπάγεται την αποδοχή των Όρων Χρήσης της Υπηρεσίας (Terms of Service) οι οποίοι βρίσκονται στο http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="en">Use of this add-on implies that you have agreed to the Terms of Service located at http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="et">Selle lisamooduli kasutamine viitab sellele, et te olete nõustunud kasutajatingimustega aadressil http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="eu">Gehigarri hau erabiltzeak http://www.wunderground.com/weather/api/d/terms.html -en aurkitzen diren zerbitzu baldintzak onartzen inplikatzen du.</disclaimer>
<disclaimer lang="fi">Tämän lisäosan käyttäminen tarkoittaa, että olet hyväksynyt osoitteessa http://www.wunderground.com/weather/api/d/terms.html sijaitsevat käyttöehdot</disclaimer>
+ <disclaimer lang="fo">Nýtsla av hesi víðkan merkir at tú góðtekur treytirnar sum finnast á http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="fr">L'utilisation de cette extension implique votre acceptation des Conditions Générales d'Utilisation disponibles sur http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="gl">Empregar este Engadido implica que vostede aceptou os termos de servizo localizados en http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="he">שימוש בתוסף זה משתמע שאישרת את תנאי השימוש אשר ממוקמים בכתובת הבאה http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
- <disclaimer lang="hr">Upotreba ovog add-ona podrazumjeva da se slažete sa Pravilima korištenja koja se nalaze na http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="hr">Upotreba ovog dodatka podrazumijeva da se slažete s Pravilima korištenja koja se nalaze na http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="hu">A kiegészítő használatával elfogadod a következő feltételeket: http://www.wunderground.com/weather/api/d/terms.html </disclaimer>
<disclaimer lang="is">Notkun á þessari viðbót gefur til kynna að þú hafir samþykkt skilmálana sem finna má á http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="it">Usando questo add-on accetti i Termini di Servizio consultabili su http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="ko">이 애드온을 사용하는 것은 http://www.wunderground.com/weather/api/d/terms.html 에 있는 서비스 약관에 동의함을 의미합니다</disclaimer>
<disclaimer lang="lt">Naudodami šį priedą jūs sutinate(-kote) su paslaugų teikimo sąlygomis esančiomis http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="mk">Користење на овој додаток имплицира дека се согласувате со условите за користење кои се наоѓаат на http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="my">ဒီ add-on ကိုသုံးခြင်းသည် http://www.wunderground.com/weather/api/d/terms.html တွင်ရှိသော Terms of Service ကိုသဘောတူညီဟု သတ်မှတ်သည်</disclaimer>
<disclaimer lang="nl">Het gebruik van deze add-on impliceert dat je akkoord gaat met de service-voorwaarden op http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="no">Bruken av dette tillegget betinger at du har godkjent brukervilkårene på http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="pl">Korzystanie z tego dodatku jest równoważne z akceptacją regulaminu dostępnego pod adresem: http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="ru">Используя это дополнение, вы соглашаетесь с условиями предоставления услуг, доступными по адресу http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="sk">Používaním tohto doplnku súhlasíte s podmienkami používania služby umiestnenými na http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="sl">Z uporabo vtičnika se strinjate s Pogoji uporabe, ki se nahajajo na http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="sq">Përdorimi i kësaj shtesës nënkupton që ke lexuar Termat e Shërbimit të lokalizuar tek http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="sv">Användning av detta tillägg innebär att ni har accepterat användarvillkoren som går att hitta på http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="ta_IN">விதிமுறைகள் ஒப்பு கொண்டீர் என்று தெரிகிறது http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="th">ในการใช้บริการโปรแกรมเสริมนี้หมายความว่าคุณได้ยอมรับเงื่อนไขในการให้บริการโดย http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="tr">Bu eklentinin kullanımı aynı zamanda http://www.wunderground.com/weather/api/d/terms.html adresindeki Kullanım koşullarını da kabul ettiğiniz anlamına gelir.</disclaimer>
<disclaimer lang="uk">Скориставшись цією надбудовою, ви тим самим погоджуєтеся з умовами використання: http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
+ <disclaimer lang="vi">Khi sử dụng add-on này đồng nghĩa với việc bạn đồng ý với các điều khoản sử dụng dịch vụ của nhà cung cấp tại địa chỉ http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="zh">使用此扩展功能意味着你同意此连接下的服务条款:http://www.wunderground.com/weather/api/d/terms.html</disclaimer>
<disclaimer lang="zh_TW">使用這個附加元件代表你同意 http://www.wunderground.com/weather/api/d/terms.html 所載之使用者條款</disclaimer>
+ <language></language>
<platform>all</platform>
+ <forum>http://forum.xbmc.org/showthread.php?tid=116668</forum>
+ <source>https://code.google.com/p/ronie/source/</source>
</extension>
</addon>
+v1.0.15
+- fix animated radar images
+- added gzip compression for image retrieval
+
+v1.0.14
+- add support for 5 locations
+- fix possible incorrect display of location name
+- remove old backward compatibility code
+
+v1.0.13
+- added localtime and localdate infolabels
+
+v1.0.12
+- added yyyy-mm-dd format for regions that use this format
+- fixed strip returns in rss label
+
+v1.0.11
+- fix corrupted alert message
+
+v1.0.10
+- fix potential crash on invalid json response
+- fix api error response check
+- added gzip compression support
+
v1.0.9
- updated language files from Transifex
# * http://www.gnu.org/copyleft/gpl.html
-import os, sys, socket, unicodedata, urllib2, time, base64
+import os, sys, socket, unicodedata, urllib2, time, base64, gzip
from datetime import date
+from StringIO import StringIO
import xbmc, xbmcgui, xbmcaddon, xbmcvfs
if sys.version_info < (2, 7):
import simplejson
socket.setdefaulttimeout(10)
+def recode(alert): # workaround: wunderground provides a corrupt alerts message
+ try:
+ alert = alert.encode("latin-1").rstrip(' )').decode("utf-8")
+ except:
+ pass
+ return alert
+
def log(txt):
if DEBUG == 'true':
if isinstance (txt,str):
def refresh_locations():
locations = 0
- for count in range(1, 4):
+ for count in range(1, 6):
loc_name = __addon__.getSetting('Location%s' % count)
if loc_name != '':
locations += 1
__addon__.setSetting('Location1id', locationid)
log('geoip location: %s' % location)
else:
+ location = ''
locationid = ''
- return locationid
+ return location, locationid
-def forecast(loc):
+def forecast(loc,locid):
try:
lang = LANG[LANGUAGE]
except:
lang = 'EN'
opt = 'lang:' + lang
- log('weather location: %s' % loc)
+ log('weather location: %s' % locid)
retry = 0
while (retry < 6) and (not xbmc.abortRequested):
- query = wundergroundapi(WEATHER_FEATURES, opt, loc, FORMAT)
+ query = wundergroundapi(WEATHER_FEATURES, opt, locid, FORMAT)
if query != '':
retry = 6
else:
log('weather download failed')
log('forecast data: %s' % query)
data = parse_data(query)
- if data != '' and not data.has_key('error'):
- properties(data,loc)
+ if data != '' and data.has_key('response') and not data['response'].has_key('error'):
+ properties(data,loc,locid)
else:
clear()
data = ''
return data
-def properties(data,loc):
+def properties(data,loc,locid):
# standard properties
weathercode = WEATHER_CODES[data['current_observation']['icon_url'][31:-4]]
- location = __addon__.getSetting('Location%s' % sys.argv[1])
- if (location == '') and (sys.argv[1] != '1'):
- location = __addon__.getSetting('Location1')
- set_property('Current.Location' , location)
+ set_property('Current.Location' , loc)
set_property('Current.Condition' , data['current_observation']['weather'])
set_property('Current.Temperature' , str(data['current_observation']['temp_c']))
set_property('Current.Wind' , str(data['current_observation']['wind_kph']))
set_property('Current.FeelsLike' , data['current_observation']['feelslike_c'])
set_property('Current.UVIndex' , data['current_observation']['UV'])
set_property('Current.DewPoint' , str(data['current_observation']['dewpoint_c']))
- set_property('Current.OutlookIcon' , '%s.png' % weathercode)
+ set_property('Current.OutlookIcon' , '%s.png' % weathercode) # xbmc translates it to Current.ConditionIcon
set_property('Current.FanartCode' , weathercode)
for count, item in enumerate(data['forecast']['simpleforecast']['forecastday']):
weathercode = WEATHER_CODES[item['icon_url'][31:-4]]
set_property('Forecast.State' , data['current_observation']['display_location']['state_name'])
set_property('Forecast.Country' , data['current_observation']['display_location']['country'])
update = time.localtime(float(data['current_observation']['observation_epoch']))
- if DATEFORMAT[1] == 'm':
- localdate = WEEKDAY[update[6]] + ' ' + MONTH[update[1]] + ' ' + str(update[2]) + ', ' + str(update[0])
+ local = time.localtime(float(data['current_observation']['local_epoch']))
+ if DATEFORMAT[1] == 'd':
+ updatedate = WEEKDAY[update[6]] + ' ' + str(update[2]) + ' ' + MONTH[update[1]] + ' ' + str(update[0])
+ localdate = WEEKDAY[local[6]] + ' ' + str(local[2]) + ' ' + MONTH[local[1]] + ' ' + str(local[0])
+ elif DATEFORMAT[1] == 'm':
+ updatedate = WEEKDAY[update[6]] + ' ' + MONTH[update[1]] + ' ' + str(update[2]) + ', ' + str(update[0])
+ localdate = WEEKDAY[local[6]] + ' ' + str(local[2]) + ' ' + MONTH[local[1]] + ' ' + str(local[0])
else:
- localdate = WEEKDAY[update[6]] + ' ' + str(update[2]) + ' ' + MONTH[update[1]] + ' ' + str(update[0])
+ updatedate = WEEKDAY[update[6]] + ' ' + str(update[0]) + ' ' + MONTH[update[1]] + ' ' + str(update[2])
+ localdate = WEEKDAY[local[6]] + ' ' + str(local[0]) + ' ' + MONTH[local[1]] + ' ' + str(local[2])
if TIMEFORMAT != '/':
- localtime = time.strftime('%I:%M%p', update)
+ updatetime = time.strftime('%I:%M%p', update)
+ localtime = time.strftime('%I:%M%p', local)
else:
- localtime = time.strftime('%H:%M', update)
- set_property('Forecast.Updated' , localdate + ' - ' + localtime)
+ updatetime = time.strftime('%H:%M', update)
+ localtime = time.strftime('%H:%M', local)
+ set_property('Forecast.Updated' , updatedate + ' - ' + updatetime)
# current properties
set_property('Current.IsFetched' , 'true')
+ set_property('Current.LocalTime' , localtime)
+ set_property('Current.LocalDate' , localdate)
set_property('Current.WindDegree' , str(data['current_observation']['wind_degrees']) + u'°')
set_property('Current.SolarRadiation' , str(data['current_observation']['solarradiation']))
if 'F' in TEMPUNIT:
weathercode = WEATHER_CODES[item['icon_url'][31:-4]]
set_property('Daily.%i.LongDay' % (count+1), item['date']['weekday'])
set_property('Daily.%i.ShortDay' % (count+1), item['date']['weekday_short'])
- if DATEFORMAT[1] == 'm':
- set_property('Daily.%i.LongDate' % (count+1), item['date']['monthname'] + ' ' + str(item['date']['day']))
- set_property('Daily.%i.ShortDate' % (count+1), MONTH[item['date']['month']] + ' ' + str(item['date']['day']))
- else:
+ if DATEFORMAT[1] == 'd':
set_property('Daily.%i.LongDate' % (count+1), str(item['date']['day']) + ' ' + item['date']['monthname'])
set_property('Daily.%i.ShortDate' % (count+1), str(item['date']['day']) + ' ' + MONTH[item['date']['month']])
+ else:
+ set_property('Daily.%i.LongDate' % (count+1), item['date']['monthname'] + ' ' + str(item['date']['day']))
+ set_property('Daily.%i.ShortDate' % (count+1), MONTH[item['date']['month']] + ' ' + str(item['date']['day']))
set_property('Daily.%i.Outlook' % (count+1), item['conditions'])
set_property('Daily.%i.OutlookIcon' % (count+1), WEATHER_ICON % weathercode)
set_property('Daily.%i.FanartCode' % (count+1), weathercode)
weathercode = WEATHER_CODES[item['icon_url'][31:-4]]
set_property('Weekend.%i.LongDay' % (count+1), item['date']['weekday'])
set_property('Weekend.%i.ShortDay' % (count+1), item['date']['weekday_short'])
- if DATEFORMAT[1] == 'm':
- set_property('Weekend.%i.LongDate' % (count+1), item['date']['monthname'] + ' ' + str(item['date']['day']))
- set_property('Weekend.%i.ShortDate' % (count+1), MONTH[item['date']['month']] + ' ' + str(item['date']['day']))
- else:
+ if DATEFORMAT[1] == 'd':
set_property('Weekend.%i.LongDate' % (count+1), str(item['date']['day']) + ' ' + item['date']['monthname'])
set_property('Weekend.%i.ShortDate' % (count+1), str(item['date']['day']) + ' ' + MONTH[item['date']['month']])
+ else:
+ set_property('Weekend.%i.LongDate' % (count+1), item['date']['monthname'] + ' ' + str(item['date']['day']))
+ set_property('Weekend.%i.ShortDate' % (count+1), MONTH[item['date']['month']] + ' ' + str(item['date']['day']))
set_property('Weekend.%i.Outlook' % (count+1), item['conditions'])
set_property('Weekend.%i.OutlookIcon' % (count+1), WEATHER_ICON % weathercode)
set_property('Weekend.%i.FanartCode' % (count+1), weathercode)
set_property('Hourly.%i.Time' % (count+1), item['FCTTIME']['civil'])
else:
set_property('Hourly.%i.Time' % (count+1), item['FCTTIME']['hour_padded'] + ':' + item['FCTTIME']['min'])
- if DATEFORMAT[1] == 'm':
- set_property('Hourly.%i.ShortDate' % (count+1), item['FCTTIME']['month_name_abbrev'] + ' ' + item['FCTTIME']['mday_padded'])
- set_property('Hourly.%i.LongDate' % (count+1), item['FCTTIME']['month_name'] + ' ' + item['FCTTIME']['mday_padded'])
- else:
+ if DATEFORMAT[1] == 'd':
set_property('Hourly.%i.ShortDate' % (count+1), item['FCTTIME']['mday_padded'] + ' ' + item['FCTTIME']['month_name_abbrev'])
set_property('Hourly.%i.LongDate' % (count+1), item['FCTTIME']['mday_padded'] + ' ' + item['FCTTIME']['month_name'])
+ else:
+ set_property('Hourly.%i.ShortDate' % (count+1), item['FCTTIME']['month_name_abbrev'] + ' ' + item['FCTTIME']['mday_padded'])
+ set_property('Hourly.%i.LongDate' % (count+1), item['FCTTIME']['month_name'] + ' ' + item['FCTTIME']['mday_padded'])
if 'F' in TEMPUNIT:
set_property('Hourly.%i.Temperature' % (count+1), item['temp']['english'] + TEMPUNIT)
set_property('Hourly.%i.DewPoint' % (count+1), item['dewpoint']['english'] + TEMPUNIT)
set_property('Hourly.%i.Outlook' % (count+1), item['condition'])
set_property('Hourly.%i.OutlookIcon' % (count+1), WEATHER_ICON % weathercode)
set_property('Hourly.%i.FanartCode' % (count+1), weathercode)
- if count == 35: # workaround: wunderground provides a 10day hourly forecast
- break
# alert properties
set_property('Alerts.IsFetched', 'true')
if str(data['alerts']) != '[]':
rss = ''
alerts = ''
for count, item in enumerate(data['alerts']):
- set_property('Alerts.%i.Description' % (count+1), item['description'])
- set_property('Alerts.%i.Message' % (count+1), item['message'])
+ description = recode(item['description']) # workaround: wunderground provides a corrupt alerts message
+ message = recode(item['message']) # workaround: wunderground provides a corrupt alerts message
+ set_property('Alerts.%i.Description' % (count+1), description)
+ set_property('Alerts.%i.Message' % (count+1), message)
set_property('Alerts.%i.StartDate' % (count+1), item['date'])
set_property('Alerts.%i.EndDate' % (count+1), item['expires'])
set_property('Alerts.%i.Significance' % (count+1), SEVERITY[item['significance']])
- rss = rss + item['description'] + ' - '
- alerts = alerts + item['message']
+ rss = rss + description.replace('\n','') + ' - '
+ alerts = alerts + message + '[CR][CR]'
set_property('Alerts.RSS' , rss.rstrip(' - '))
- set_property('Alerts' , alerts)
+ set_property('Alerts' , alerts.rstrip('[CR][CR]'))
set_property('Alerts.Count' , str(count+1))
else:
set_property('Alerts.RSS' , '')
# map properties
set_property('Map.IsFetched', 'true')
filelist = []
- locid = base64.b16encode(loc)
+ locid = base64.b16encode(locid)
addondir = os.path.join(__cwd__, 'resources', 'logo')
mapdir = xbmc.translatePath('special://profile/addon_data/%s/map' % __addonid__)
set_property('MapPath', addondir)
if not xbmcvfs.exists(mapdir):
xbmcvfs.mkdir(mapdir)
- json_query = xbmc.executeJSONRPC('{ "jsonrpc" : "2.0" , "method" : "Files.GetDirectory" , "params" : { "directory" : "%s" , "sort" : { "method" : "file" } } , "id" : 1 }' % mapdir.replace('\\', '\\\\'))
- json_query = unicode(json_query, 'utf-8', errors='ignore')
- json_response = simplejson.loads(json_query)
- if (json_response['result'] != None) and (json_response['result'].has_key('files')) and (json_response['result']['files'] != None):
- for item in json_response['result']['files']:
- if item['filetype'] == 'file':
- filelist.append(item['file'])
+ dirs, filelist = xbmcvfs.listdir(mapdir)
animate = __addon__.getSetting('Animate')
- for item in filelist:
+ for img in filelist:
+ item = xbmc.translatePath('special://profile/addon_data/%s/map/%s' % (__addonid__,img)).decode("utf-8")
if animate == 'true':
if (time.time() - os.path.getmtime(item) > 14400) or (not locid in item):
xbmcvfs.delete(item)
url = data['satellite']['image_url_ir4'].replace('width=300&height=300','width=640&height=360').replace('radius=75','radius=%i' % int(1000/int(zoom.rstrip('0').rstrip('.,'))))
log('map url: %s' % url)
try:
- req = urllib2.urlopen(url)
- response = req.read()
- req.close()
+ req = urllib2.Request(url)
+ req.add_header('Accept-encoding', 'gzip')
+ response = urllib2.urlopen(req)
+ if response.info().get('Content-Encoding') == 'gzip':
+ buf = StringIO(response.read())
+ compr = gzip.GzipFile(fileobj=buf)
+ data = compr.read()
+ else:
+ data = response.read()
+ response.close()
log('satellite image downloaded')
except:
- response = ''
+ data = ''
log('satellite image downloaded failed')
- if response != '':
+ if data != '':
timestamp = time.strftime('%Y%m%d%H%M%S')
mapfile = xbmc.translatePath('special://profile/addon_data/%s/map/%s-%s.png' % (__addonid__,locid,timestamp)).decode("utf-8")
try:
tmpmap = open(mapfile, 'wb')
- tmpmap.write(response)
+ tmpmap.write(data)
tmpmap.close()
set_property('MapPath', mapdir)
except:
log('selected location id: %s' % locationids[selected])
else:
dialog.ok(__addonname__, xbmc.getLocalizedString(284))
-
else:
- location = __addon__.getSetting('Location%sid' % sys.argv[1])
- if (location == '') and (sys.argv[1] != '1'):
- location = __addon__.getSetting('Location1id')
+ location = __addon__.getSetting('Location%s' % sys.argv[1])
+ locationid = __addon__.getSetting('Location%sid' % sys.argv[1])
+ if (locationid == '') and (sys.argv[1] != '1'):
+ location = __addon__.getSetting('Location1')
+ locationid = __addon__.getSetting('Location1id')
log('trying location 1 instead')
- if location == '':
+ if locationid == '':
log('fallback to geoip')
- location = geoip()
- if not location == '':
- if location.startswith('/q/'): # backwards compatibility
- location = location[3:]
- forecast(location)
+ location, locationid = geoip()
+ if not locationid == '':
+ forecast(location, locationid)
else:
log('no location found')
clear()
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Albanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Cilësime të vendi"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Cilësime të shtuara"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Vendi 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Vendi 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Vendi 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Vendi 1 trego emrin"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Vendi 2 trego emrin"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Vendi 3 trego emrin"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Vendi 1 id"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Vendi 2 id"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Vendi 3 id"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "Aktivo logging"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Fundjavë"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "E Shtunë/E Diel "
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "E Premte/E Shtunë"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "E Ejnte/E Premte"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Niveli i zoom'it i hartës"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Hart e gjallëruar"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Hëna e re"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "Hëna e gjysme duke plotësuar"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Hëna e plotësuar 1/4"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "Hëna duke plotësuar"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Hëna e plotë"
+
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "Hëna e plotësuar 3/4"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Hëna e plotësuar 3/4"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "Hëna e plotësuar 3/4"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Kujdësi"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "Shikimi"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Këshillë"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Caktimi"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Pikëpamje"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "Parashikimi"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Synopsis"
msgid "Location 3 id"
msgstr "አካባቢ 3 መለያ"
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "መግቢያ ማስቻያ"
+
msgctxt "#32121"
msgid "Weekend"
msgstr "የሳምንቱ መጨረሻ"
msgctxt "#32122"
msgid "Saturday/Sunday"
-msgstr "ቅዳሜ / እሑድ "
+msgstr "ቅዳሜ/እሑድ "
msgctxt "#32123"
msgid "Friday/Saturday"
-msgstr "አርብ / ቅዳሜ "
+msgstr "አርብ/ቅዳሜ "
msgctxt "#32124"
msgid "Thursday/Friday"
-msgstr "ሐሙስ / አርብ "
+msgstr "ሐሙስ/አርብ "
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "የካርታ ማሳያ መጠን"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "ተንቀሳቃሽ ካርታ"
+
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "አካባቢ 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "አካባቢ 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "አካባቢ 4 ስም ማሳያ"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "አካባቢ 5 ስም ማሳያ"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "አካባቢ 4 መለያ"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "አካባቢ 5 መለያ"
msgctxt "#32501"
msgid "New Moon"
msgstr "አዲስ ጨረቃ "
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "እየጨመረ የሚሄድ ከ ግማሽ በታች"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "የመጀመሪያው ሩብ"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "እየጨመረ የሚሄድ ከ ግማሽ በላይ "
+
msgctxt "#32505"
msgid "Full Moon"
msgstr "ሙሉ ጨረቃ "
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "እየቀነሰ የሚሄድ ከ ግማሽ በላይ በላይ "
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "የመጨረሻው ሩብ"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "እየቀነሰ የሚሄድ ከ ግማሽ በታች"
+
msgctxt "#32510"
msgid "Warning"
msgstr "ማስጠንቀቂያ "
+msgctxt "#32511"
+msgid "Watch"
+msgstr "ይጠንቀቁ"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "ይመከራሉ "
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "ባጠቃላይ "
+
msgctxt "#32515"
msgid "Forecast"
-msgstr "á\8c\8dá\88\9dá\89µ "
+msgstr "á\8b°á\88\98á\8a\93á\88\9b "
msgctxt "#32117"
msgid "Location 1 id"
-msgstr "Идентификато на място 1"
+msgstr "Идентификатор на място 1"
msgctxt "#32118"
msgid "Location 2 id"
msgctxt "#32119"
msgid "Location 3 id"
-msgstr "Идентификато на място 3"
+msgstr "Идентификатор на място 3"
msgctxt "#32120"
msgid "Enable logging"
msgid "Animated map"
msgstr "Анимиране на картата"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Място 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Място 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Име за място 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Име за място 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Идентификатор на място 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Идентификатор на място 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Новолуние"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Burmese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/my/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: my\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "တည်နေရာ setup"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "တည်နေရာ ၁"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "တည်နေရာ ၂"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "တည်နေရာ ၃"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "တည်နေရာ ၁ ဖော်ပြထားသောအမည်"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "တည်နေရာ ၂ ဖော်ပြထားသောအမည်"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "တည်နေရာ ၃ ဖော်ပြထားသောအမည်"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "တည်နေရာ ၁ id"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "တည်နေရာ ၂ id"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "တည်နေရာ ၃ id"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "စနေနှင့်တနင်္ဂနွေ"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "စနေ၊တနင်္ဂနွေ"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "သောကြာ၊စနေ"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "ကြာသပတေး၊သောကြာ"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Map zoom level"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "လ အသစ်"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "လပြည့်"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "သတိပေးချက်"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "စောင့်ကြည့်မည်"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "ဖော်ပြချက်"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Outlook"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "ခန့်မှန်းချက်"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Configuració de la ubicació"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Opcions avançades"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Ubicació 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Ubicació 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Ubicació 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Nom a mostrar de la ubicació 1"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Nom a mostrar de la ubicació 2"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Nom a mostrar de la ubicació 3"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Id de la ubicació 1"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Id de la ubicació 2"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Id de la ubicació 3"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "Habilita el registre"
+
msgctxt "#32121"
msgid "Weekend"
msgstr "Cap de setmana"
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Dissabte/Diumenge"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "Divendres/Dissabte"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "Dijous/Divendres"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Nivell de zoom del mapa"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Mapa animat"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Lluna nova"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "Lluna nova visible"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Quart creixent"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "Lluna gibosa creixent"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Lluna plena"
+
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "Lluna gibosa minvant"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Quart minvant"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "Lluna minvant"
+
msgctxt "#32510"
msgid "Warning"
msgstr "Advertència"
+msgctxt "#32511"
+msgid "Watch"
+msgstr "Veure"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Advertència"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Declaració"
+
msgctxt "#32514"
msgid "Outlook"
msgstr "Outlook"
msgctxt "#32515"
msgid "Forecast"
msgstr "Predicció"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Sinopsi"
msgid "Animated map"
msgstr "动态地图"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "地点4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "地点5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "地点4显示名称"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "地点5显示名称"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "地点4 ID"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "地点5 ID"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "新月"
msgctxt "#32101"
msgid "Location setup"
-msgstr "Namjesti lokaciju"
+msgstr "Podešavanje lokacije"
msgctxt "#32102"
msgid "Advanced options"
-msgstr "Dodatne opcije"
+msgstr "Napredne mogućnosti"
msgctxt "#32111"
msgid "Location 1"
msgctxt "#32114"
msgid "Location 1 display name"
-msgstr "Lokacija 1 ime ekrana"
+msgstr "Naziv 1. lokacije"
msgctxt "#32115"
msgid "Location 2 display name"
-msgstr "Lokacija 2 ime ekrana"
+msgstr "Naziv 2. lokacije"
msgctxt "#32116"
msgid "Location 3 display name"
-msgstr "Lokacija 3 ime ekrana"
+msgstr "Naziv 3. lokacije"
msgctxt "#32117"
msgid "Location 1 id"
-msgstr "Lokacija 1 id"
+msgstr "ID lokacije 1"
msgctxt "#32118"
msgid "Location 2 id"
-msgstr "Lokacija 2 id"
+msgstr "ID lokacije 2"
msgctxt "#32119"
msgid "Location 3 id"
-msgstr "Lokacija 3 id"
+msgstr "ID lokacije 3"
msgctxt "#32120"
msgid "Enable logging"
-msgstr "Omogućiti prijave"
+msgstr "Omogući prijave"
msgctxt "#32121"
msgid "Weekend"
msgctxt "#32126"
msgid "Animated map"
-msgstr "Animirane mape"
+msgstr "Animirana karta"
+
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Lokacija 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Lokacija 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Lokacija 4 prikaži naziv"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Lokacija 5 prikaži naziv"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Lokacija 4 ID"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Lokacija 5 ID"
msgctxt "#32501"
msgid "New Moon"
msgctxt "#32510"
msgid "Warning"
-msgstr "Obavjesti"
+msgstr "Upozorenje"
msgctxt "#32511"
msgid "Watch"
msgctxt "#32514"
msgid "Outlook"
-msgstr "Izgledi"
+msgstr "Prognoza"
msgctxt "#32515"
msgid "Forecast"
msgid "Animated map"
msgstr "Animovaná mapa"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Umístění 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Umístění 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Zobrazovaný název umístění 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Zobrazovaný název umístění 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "ID umístění 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "ID umístění 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Novoluní"
msgid "Animated map"
msgstr "Geanimeerde kaart"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Locatie 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Locatie 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Locatie 4 weergave naam"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Locatie 5 weergave naam"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Locatie 4 id"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Locatie 5 id"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Nieuwe maan"
+++ /dev/null
-# XBMC Media Center language file
-# Addon Name: Weather Underground
-# Addon id: weather.wunderground
-# Addon version: 0.0.9
-# Addon Provider: Team XBMC
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
-"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
-"POT-Creation-Date: 2012-05-28 15:38+0000\n"
-"PO-Revision-Date: 2012-05-28 23:42+0000\n"
-"Last-Translator: XBMC Translation Team\n"
-"Language-Team: English (United States) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en_US/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: en_US\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30101"
-msgid "Location Setup"
-msgstr ""
-
-msgctxt "#30111"
-msgid "Change location 1"
-msgstr ""
-
-msgctxt "#30112"
-msgid "Change location 2"
-msgstr ""
-
-msgctxt "#30113"
-msgid "Change location 3"
-msgstr ""
msgid "Animated map"
msgstr ""
-#empty strings from id 32127 to 32500
+msgctxt "#32127"
+msgid "Location 4"
+msgstr ""
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr ""
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr ""
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr ""
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr ""
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr ""
+
+#empty strings from id 32133 to 32500
msgctxt "#32501"
msgid "New Moon"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Faroese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Uppseting av stað"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Víðkaðar stillingar"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Stað 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Stað 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Stað 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Heiti á stað 1"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Heiti á stað 2"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Heiti á stað 3"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Stað 1 id"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Stað 2 id"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Stað 3 id"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "Tendra log"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Vikuskifti"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Leygardagur/Sunnudagur"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "Fríggjadagur/Leygardagur"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "Hósdagur/Fríggjadagur"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Stødd á korti"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Livandi kort"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Nýmáni (tendring)"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "Hálvmáni"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Fyrsti fjórðingur"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Fullmáni (full sól)"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Seinni fjórðingur"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Ávarðing"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "Hygg"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Vegleiðing"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Frágreiðing"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Útlit"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "Forsøgn"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Samandráttur"
msgid "Animated map"
msgstr "Carte animée"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Emplacement 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Emplacement 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Nom de l'emplacement 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Nom de l'emplacement 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Identifiant emplacement 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Identifiant emplacement 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Nouvelle Lune"
msgctxt "#32503"
msgid "First Quarter"
-msgstr "Erstes Quartal"
+msgstr "Zunehmender Halbmond"
msgctxt "#32504"
msgid "Waxing Gibbous"
-msgstr "Zweites Viertel"
+msgstr "Zunehmender Mond"
msgctxt "#32505"
msgid "Full Moon"
msgctxt "#32506"
msgid "Waning Gibbous"
-msgstr "Drittes Viertel"
+msgstr "Abnehmender Mond"
msgctxt "#32507"
msgid "Last Quarter"
-msgstr "Letztes Quartal"
+msgstr "Abnehmender Halbmond"
msgctxt "#32508"
msgid "Waning Crescent"
msgctxt "#32510"
msgid "Warning"
-msgstr "Achtung"
+msgstr "Warnung"
msgctxt "#32511"
msgid "Watch"
msgctxt "#32514"
msgid "Outlook"
-msgstr "Outlook"
+msgstr "Ausblick"
msgctxt "#32515"
msgid "Forecast"
msgid "Animated map"
msgstr "Εφέ χάρτη"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Τοποθεσία 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Τοποθεσία 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Ονομασία Τοποθεσίας 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Ονομασία Τοποθεσίας 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "ID Τοποθεσίας 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "ID Τοποθεσίας 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Νέα Σελήνη"
msgid "Weekend"
msgstr "Helgi"
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Athugið"
+
msgctxt "#32514"
msgid "Outlook"
msgstr "Veðurspá"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Akhir Pekan"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Peringatan"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Pandangan"
msgid "Animated map"
msgstr "Mappa animata"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Località 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Località 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Località 4 mostra nome"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Località 5 mostra nome"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Località 4 id"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Località 5 id"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Novilunio"
msgid "Animated map"
msgstr "Animowana mapa"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Lokalizacja 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Lokalizacja 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Wyświetlana nazwa lokalizacji 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Wyświetlana nazwa lokalizacji 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Lokalizacja 4 id"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Lokalizacja 5 id"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Księżyc w nowiu"
msgid "Animated map"
msgstr "Mapa animado"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Localização 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Localização 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Nome a exibir de localização 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Nome a exibir de localização 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Id de localização 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Id de localização 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Lua Nova"
msgid "Animated map"
msgstr "Mapa animado"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Ubicación 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Ubicación 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Nombre a mostrar para ubicación 4"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Nombre a mostrar para ubicación 5"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Id de ubicación 4"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Id de ubicación 5"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Luna nueva"
msgid "Animated map"
msgstr "Animerad karta"
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "Plats 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "Plats 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "Plats 4 visningsnamn"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "Plats 5 visningsnamn"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "Plats 4 id"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "Plats 5 id"
+
msgctxt "#32501"
msgid "New Moon"
msgstr "Nymåne"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ta_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ta_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "இருப்பிடம் அமைப்பு"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "கூடுதல் விருப்பங்கள்"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "இருப்பிடம் 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "இருப்பிடம் 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "இருப்பிடம் 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "இருப்பிடம் 1 காட்சி பெயர்"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "இருப்பிடம் 2 காட்சி பெயர்"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "இருப்பிடம் 3 காட்சி பெயர்"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "இருப்பிடம் 1 எண்"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "இருப்பிடம் 2 எண்"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "இருப்பிடம் 3 எண்"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "பதிவெடுத்தலை செயல்படுத்து"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "வார இறுதி"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "சனி/ஞாயிறு"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "வெள்ளி/சனி"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "வியாழன்/வெள்ளி"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "நிலப்படம் பெரிதாக்கு நிலை"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "அசைவூட்டபட்ட நிலப்படம்"
+
+msgctxt "#32127"
+msgid "Location 4"
+msgstr "இருப்பிடம் 4"
+
+msgctxt "#32128"
+msgid "Location 5"
+msgstr "இருப்பிடம் 5"
+
+msgctxt "#32129"
+msgid "Location 4 display name"
+msgstr "இருப்பிடம் 4 காட்சி பெயர்"
+
+msgctxt "#32130"
+msgid "Location 5 display name"
+msgstr "இருப்பிடம் 5 காட்சி பெயர்"
+
+msgctxt "#32131"
+msgid "Location 4 id"
+msgstr "இருப்பிடம் 4 எண்"
+
+msgctxt "#32132"
+msgid "Location 5 id"
+msgstr "இருப்பிடம் 5 எண்"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "அமாவாசை"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "வளர்பிறை"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "முதல் கால்பகுதி"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "வளர்பிறை"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "பௌர்ணமி"
+
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "தேய்பிறை"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "கடைசி கால்பகுதி"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "தேய்பிறை"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "எச்சரிக்கை"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "கண்காணிப்பு"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "ஆலோசனை"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "கூற்று"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "கண்ணோட்டம்"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "முன் அறிவிப்பு"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "தொகுப்பு"
msgid "Last Quarter"
msgstr "Son Dördün"
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "Hilal"
+
msgctxt "#32510"
msgid "Warning"
msgstr "Uyarı"
msgid "Watch"
msgstr "İzle"
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Öneri"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Açıklama"
+
msgctxt "#32514"
msgid "Outlook"
msgstr "Outlook"
msgctxt "#32515"
msgid "Forecast"
msgstr "Hava Tahmini"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Özet"
"Language: uk\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Налаштування місцевості"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Додаткові налаштування"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Місцевість 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Місцевість 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Місцевість 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Назва для показу Місцевості 1 "
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Назва для показу Місцевості 2 "
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Назва для показу Місцевості 3 "
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Ідентифікація Місцевості 1 "
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Ідентифікація Місцевості 2 "
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Ідентифікація Місцевості 3 "
+
msgctxt "#32121"
msgid "Weekend"
msgstr "Вихідні"
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Субота/Неділя"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "П’ятниця/Субота"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Ступінь збільшення мапи"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Анімована мапа"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Новий місяць"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Перша чверть"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Повний місяць"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Остання чверть"
+
msgctxt "#32510"
msgid "Warning"
msgstr "Увага"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Uzbek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uz/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: uz\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "O'rnashgan joy moslamalari"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Qo'shimcha parametrlar"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "O'rnashgan joy 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "O'rnashgan joy 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "O'rnashgan joy 3"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Dam olish kunlari"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Shanba/Yakshanba"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "Juma/Shanba"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "Payshanba/Juma"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Yangi oy"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Birinchi chorak"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "To'lgan oy"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Oxirgi chorak"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Ogohlantirish"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Vietnamese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Thiết lập Chổ"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Các chức năng nâng cao"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Chổ 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Chổ 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Chổ 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Hiển thị tên của Chổ 1"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Hiển thị tên của Chổ 2"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Hiển thị tên của Chổ 3"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Mã địa điểm 1"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Mã địa điểm 2"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Mã địa điểm 3"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "Lưu lại báo cáo"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Cuối tuần"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Thứ bảy/Chủ Nhật"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "Thứ sáu/Thứ bảy"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "Thứ năm/Thứ sáu"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Bản đồ mức độ phóng"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Bản đồ di chuyển"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Tuần trăng mới"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "Trăng lưỡi liềm"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Quý đầu tiên"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "Trăng khuyết"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Trăng tròn"
+
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "Trăng khuyết"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Quý cuối cùng"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "Trăng lưỡi liềm"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Cảnh báo"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "Xem"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Lời khuyên"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Báo cáo"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Toàn cảnh"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "Dự báo"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Tóm tắt"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: Weather Underground
+# Addon id: weather.wunderground
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Main Translation Project (Frodo)\n"
+"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Welsh (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
+
+msgctxt "#32101"
+msgid "Location setup"
+msgstr "Gosod y lleoliad"
+
+msgctxt "#32102"
+msgid "Advanced options"
+msgstr "Dewisiadau uwch"
+
+msgctxt "#32111"
+msgid "Location 1"
+msgstr "Lleoliad 1"
+
+msgctxt "#32112"
+msgid "Location 2"
+msgstr "Lleoliad 2"
+
+msgctxt "#32113"
+msgid "Location 3"
+msgstr "Lleoliad 3"
+
+msgctxt "#32114"
+msgid "Location 1 display name"
+msgstr "Enw Dangos Lleoliad 1"
+
+msgctxt "#32115"
+msgid "Location 2 display name"
+msgstr "Enw Dangos Lleoliad 2"
+
+msgctxt "#32116"
+msgid "Location 3 display name"
+msgstr "Enw Dangos Lleoliad 3"
+
+msgctxt "#32117"
+msgid "Location 1 id"
+msgstr "Dynodiad Lleoliad 1"
+
+msgctxt "#32118"
+msgid "Location 2 id"
+msgstr "Dynodiad Lleoliad 2"
+
+msgctxt "#32119"
+msgid "Location 3 id"
+msgstr "Dynodiad Lleoliad 3"
+
+msgctxt "#32120"
+msgid "Enable logging"
+msgstr "Galluogi cofnodi"
+
+msgctxt "#32121"
+msgid "Weekend"
+msgstr "Penwythnos"
+
+msgctxt "#32122"
+msgid "Saturday/Sunday"
+msgstr "Sadwrn/Sul"
+
+msgctxt "#32123"
+msgid "Friday/Saturday"
+msgstr "Gwener/Sadwrn"
+
+msgctxt "#32124"
+msgid "Thursday/Friday"
+msgstr "Iau/Gwener"
+
+msgctxt "#32125"
+msgid "Map zoom level"
+msgstr "Lefel chwyddo map"
+
+msgctxt "#32126"
+msgid "Animated map"
+msgstr "Map wedi ei animeiddio"
+
+msgctxt "#32501"
+msgid "New Moon"
+msgstr "Lleuad Newydd"
+
+msgctxt "#32502"
+msgid "Waxing Crescent"
+msgstr "Lleuad ar ei Chynnydd"
+
+msgctxt "#32503"
+msgid "First Quarter"
+msgstr "Chwarter Cyntaf"
+
+msgctxt "#32504"
+msgid "Waxing Gibbous"
+msgstr "Cynnydd Lleuad Amgrwn"
+
+msgctxt "#32505"
+msgid "Full Moon"
+msgstr "Lleuad Llawn"
+
+msgctxt "#32506"
+msgid "Waning Gibbous"
+msgstr "Ciliad Lleuad Amgrwn"
+
+msgctxt "#32507"
+msgid "Last Quarter"
+msgstr "Chwarter Olaf"
+
+msgctxt "#32508"
+msgid "Waning Crescent"
+msgstr "Ciliad Cilgant Lleuad"
+
+msgctxt "#32510"
+msgid "Warning"
+msgstr "Rhybudd"
+
+msgctxt "#32511"
+msgid "Watch"
+msgstr "Gwylio"
+
+msgctxt "#32512"
+msgid "Advisory"
+msgstr "Awgrymiad"
+
+msgctxt "#32513"
+msgid "Statement"
+msgstr "Datganiad"
+
+msgctxt "#32514"
+msgid "Outlook"
+msgstr "Rhagolygon"
+
+msgctxt "#32515"
+msgid "Forecast"
+msgstr "Rhagolygon"
+
+msgctxt "#32516"
+msgid "Synopsis"
+msgstr "Crynodeb"
#http://www.wunderground.com/weather/api/d/docs?d=language-support
# xbmc lang name # wu code
LANG = { 'afrikaans' : 'AF',
+ 'albanian' : 'AL',
+ 'amharic' : 'EN', # AM is n/a, use AR or EN?
'arabic' : 'AR',
+ 'azerbaijani' : 'AZ',
'basque' : 'EU',
'belarusian' : 'BY',
'bosnian' : 'CR', # BS is n/a, use CR or SR?
'bulgarian' : 'BU',
+ 'burmese' : 'MY',
'catalan' : 'CA',
'chinese (simple)' : 'CN',
'chinese (traditional)' : 'TW',
'english (us)' : 'EN',
'esperanto' : 'EO',
'estonian' : 'ET',
+ 'faroese' : 'DK', # FO is n/a, use DK
'finnish' : 'FI',
'french' : 'FR',
'galician' : 'GZ',
'italian' : 'IT',
'japanese' : 'JP',
'korean' : 'KR',
+ 'latvian' : 'LV',
'lithuanian' : 'LT',
'macedonian' : 'MK',
+ 'malay' : 'EN', # MS is n/a, use EN
+ 'malayalam' : 'EN', # ML is n/a, use EN
'maltese' : 'MT',
'norwegian' : 'NO',
+ 'ossetic' : 'EN', # OS is n/a, use EN
+ 'persian' : 'FA',
+ 'persian (iran)' : 'FA',
'polish' : 'PL',
'portuguese' : 'BR',
'portuguese (brazil)' : 'BR',
'spanish (argentina)' : 'SP',
'spanish (mexico)' : 'SP',
'swedish' : 'SW',
+ 'tamil (india)' : 'EN', # TA is n/a, use EN
'thai' : 'TH',
'turkish' : 'TU',
- 'ukrainian' : 'UA'}
+ 'ukrainian' : 'UA',
+ 'uzbek' : 'UZ',
+ 'vietnamese' : 'VU',
+ 'vietnamese (viet nam)' : 'VU',
+ 'welsh' : 'CY'}
WEATHER_CODES = { 'chanceflurries' : '41',
'chancerain' : '39',
# -*- coding: utf-8 -*-
-import urllib2, base64
+import urllib2, gzip, base64
+from StringIO import StringIO
WAIK = 'NDEzNjBkMjFkZjFhMzczNg=='
-WUNDERGROUND_URL = 'http://api.wunderground.com/api/KEY/%s/%s/q/%s.%s'
+WUNDERGROUND_URL = 'http://api.wunderground.com/api/%s/%s/%s/q/%s.%s'
API_EXCLUDE = ['hourly10day', 'yesterday', 'planner', 'webcams', 'animatedradar', 'animatedsatellite', 'currenthurricane']
def wundergroundapi(features, settings, query, format):
return 'api access to %s restricted' % item
if not settings:
settings = 'lang:EN'
- query = WUNDERGROUND_URL % (features, settings, query, format)
- url = query.replace('KEY',(base64.b64decode(WAIK)[::-1]),1)
+ url = WUNDERGROUND_URL % (base64.b64decode(WAIK)[::-1], features, settings, query, format)
try:
- req = urllib2.urlopen(url)
- response = req.read()
- req.close()
+ req = urllib2.Request(url)
+ req.add_header('Accept-encoding', 'gzip')
+ response = urllib2.urlopen(req)
+ if response.info().get('Content-Encoding') == 'gzip':
+ buf = StringIO(response.read())
+ compr = gzip.GzipFile(fileobj=buf)
+ data = compr.read()
+ else:
+ data = response.read()
+ response.close()
except:
- response = ''
- return response
+ data = ''
+ return data
<setting id="Location1" label="32111" type="action" action="RunScript($ID,Location1)" default=""/>
<setting id="Location2" label="32112" type="action" action="RunScript($ID,Location2)" enable="!eq(-1,)" default=""/>
<setting id="Location3" label="32113" type="action" action="RunScript($ID,Location3)" enable="!eq(-1,)" default=""/>
+ <setting id="Location4" label="32127" type="action" action="RunScript($ID,Location4)" enable="!eq(-1,)" default=""/>
+ <setting id="Location5" label="32128" type="action" action="RunScript($ID,Location5)" enable="!eq(-1,)" default=""/>
<setting id="Location1id" type="text" visible="false" default=""/>
<setting id="Location2id" type="text" visible="false" default=""/>
<setting id="Location3id" type="text" visible="false" default=""/>
+ <setting id="Location4id" type="text" visible="false" default=""/>
+ <setting id="Location5id" type="text" visible="false" default=""/>
</category>
<category label="32102">
<setting id="Location1" label="32114" type="text" default=""/>
<setting id="Location3" label="32116" type="text" enable="!eq(-3,)" default=""/>
<setting id="Location3id" label="32119" type="text" subsetting="true" enable="!eq(-3,)" default=""/>
<setting type="sep"/>
+ <setting id="Location4" label="32129" type="text" enable="!eq(-3,)" default=""/>
+ <setting id="Location4id" label="32131" type="text" subsetting="true" enable="!eq(-3,)" default=""/>
+ <setting type="sep"/>
+ <setting id="Location5" label="32130" type="text" enable="!eq(-3,)" default=""/>
+ <setting id="Location5id" label="32132" type="text" subsetting="true" enable="!eq(-3,)" default=""/>
+ <setting type="sep"/>
<setting id="Zoom" label="32125" type="slider" option="int" range="1,100" default="10"/>
<setting id="Animate" label="32126" type="bool" default="false"/>
<setting id="Weekend" label="32121" type="enum" lvalues="32122|32123|32124" default="0"/>
<?xml version="1.0" encoding="UTF-8"?>
-<addon id="xbmc.addon" version="12.9.5" provider-name="Team XBMC">
+<addon id="xbmc.addon" version="12.9.6" provider-name="Team XBMC">
<backwards-compatibility abi="12.0"/>
<requires>
<import addon="xbmc.core" version="0.1.0"/>
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
-AC_INIT([xbmc], [12.9.5], [http://trac.xbmc.org])
+AC_INIT([xbmc], [12.9.6], [http://trac.xbmc.org])
AC_CONFIG_HEADERS([xbmc/config.h])
AH_TOP([#pragma once])
m4_include([m4/ax_python_devel.m4])
virtual void avcodec_register_all(void)=0;
virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0;
virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)=0;
- virtual AVCodec *avcodec_find_decoder(enum CodecID id)=0;
- virtual AVCodec *avcodec_find_encoder(enum CodecID id)=0;
+ virtual AVCodec *avcodec_find_decoder(enum AVCodecID id)=0;
+ virtual AVCodec *avcodec_find_encoder(enum AVCodecID id)=0;
virtual int avcodec_close_dont_call(AVCodecContext *avctx)=0;
virtual AVFrame *avcodec_alloc_frame(void)=0;
virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height)=0;
}
virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { *(volatile int *)0x0 = 0; return 0; }
virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(volatile int *)0x0 = 0; return 0; }
- virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); }
- virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); }
+ virtual AVCodec *avcodec_find_decoder(enum AVCodecID id) { return ::avcodec_find_decoder(id); }
+ virtual AVCodec *avcodec_find_encoder(enum AVCodecID id) { return ::avcodec_find_encoder(id); }
virtual int avcodec_close(AVCodecContext *avctx)
{
CSingleLock lock(DllAvCodec::m_critSection);
LOAD_SYMBOLS();
DEFINE_METHOD0(void, avcodec_register_all_dont_call)
- DEFINE_METHOD1(AVCodec*, avcodec_find_decoder, (enum CodecID p1))
- DEFINE_METHOD1(AVCodec*, avcodec_find_encoder, (enum CodecID p1))
+ DEFINE_METHOD1(AVCodec*, avcodec_find_decoder, (enum AVCodecID p1))
+ DEFINE_METHOD1(AVCodec*, avcodec_find_encoder, (enum AVCodecID p1))
DEFINE_METHOD1(int, avcodec_close_dont_call, (AVCodecContext *p1))
DEFINE_METHOD0(AVFrame*, avcodec_alloc_frame)
DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5))
#include <libavfilter/avfiltergraph.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/avcodec.h>
+ #include <libavfilter/buffersrc.h>
#else
#include "libavfilter/avfiltergraph.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/avcodec.h"
+ #include "libavfilter/buffersrc.h"
#endif
}
if (cb == NULL)
return "";
- string buffer = ((CB_AddOnLib*)cb)->GetDVDMenuLanguage(((AddonCB*)hdl)->addonData);
- return strdup(buffer.c_str());
+ return ((CB_AddOnLib*)cb)->GetDVDMenuLanguage(((AddonCB*)hdl)->addonData);
}
DLLEXPORT void XBMC_free_string(void* hdl, void* cb, char* str)
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.xbmc.xbmc"
- android:versionCode="11"
- android:versionName="13.0-ALPHA5" >
+ android:versionCode="12"
+ android:versionName="13.0-ALPHA6" >
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="14" />
Node doc = null
def ret = ''
- // make the class name or namespave
+ // make the class name or namespace
String doxygenId = findFullClassName(methodOrClass,'_1_1')
boolean isInClass = doxygenId != null
if (!doxygenId)
{
Node memberdef = docspec.depthFirst().find {
return (it instanceof String) ? false :
- ((it.name() == 'memberdef' && it.@kind == 'function' && it.@id.startsWith(doxygenId)) &&
+ ((it.name() == 'memberdef' && (it.@kind == 'function' || it.@kind == 'variable') && it.@id.startsWith(doxygenId)) &&
(it.name != null && it.name.text().trim() == methodOrClass.@sym_name))
}
new Node(it,'doc',['value' : doc])
}
}
+
+ // now remove all non-public variables
+ List allVariables = ret.depthFirst().findAll({ it.name() == 'variable' })
+ allVariables.each {
+ if (it.@access != null && it.@access != 'public')
+ it.parent().remove(it)
+ else
+ {
+ def doc = retrieveDocStringFromDoxygen(it)
+ if (doc != null && doc != '' && doc.trim() != ' ')
+ new Node(it,'doc',['value' : doc])
+ }
+ }
// add the doc string to the classes
List allClasses = ret.depthFirst().findAll({ it.name() == 'class'})
PACKAGE=org.xbmc.xbmc-atv2
VERSION=13.0
-REVISION=0~alpha5
+REVISION=0~alpha6
ARCHIVE=${PACKAGE}_${VERSION}-${REVISION}_iphoneos-arm.deb
echo Creating $PACKAGE package version $VERSION revision $REVISION
PACKAGE=org.xbmc.xbmc-ios
VERSION=13.0
-REVISION=0~alpha5
+REVISION=0~alpha6
ARCHIVE=${PACKAGE}_${VERSION}-${REVISION}_iphoneos-arm.deb
echo Creating $PACKAGE package version $VERSION revision $REVISION
cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
cd $(PLATFORM); patch -p0 < ../prefix.patch
cd $(PLATFORM); patch -p1 < ../librtmp-60-second-fix.patch
+ cd $(PLATFORM)/librtmp; patch -p0 < ../../libm.patch
sed -i -e 's|CC=|#CC=|' $(PLATFORM)/librtmp/Makefile
sed -i -e 's|LD=|#LD=|' $(PLATFORM)/librtmp/Makefile
sed -i -e 's|AR=|#AR=|' $(PLATFORM)/librtmp/Makefile
--- /dev/null
+--- Makefile.old 2013-06-04 17:35:58.000000000 +0200
++++ Makefile 2013-06-04 17:36:13.000000000 +0200
+@@ -25,7 +25,7 @@
+ REQ_GNUTLS=gnutls
+ REQ_OPENSSL=libssl,libcrypto
+ LIBZ=-lz
+-LIBS_posix=
++LIBS_posix=-lm
+ LIBS_darwin=
+ LIBS_mingw=-lws2_32 -lwinmm -lgdi32
+ LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ)
}
// Now check with the player if action can be handled.
- if (m_pPlayer != NULL && m_pPlayer->OnAction(action))
- return true;
+ if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO ||
+ (g_windowManager.GetActiveWindow() == WINDOW_DIALOG_VIDEO_OSD && (action.GetID() == ACTION_NEXT_ITEM || action.GetID() == ACTION_PREV_ITEM || action.GetID() == ACTION_CHANNEL_UP || action.GetID() == ACTION_CHANNEL_DOWN)))
+ {
+ if (m_pPlayer != NULL && m_pPlayer->OnAction(action))
+ return true;
+ }
// stop : stops playing current audio song
if (action.GetID() == ACTION_STOP)
#define VERSION_MAJOR 13
#define VERSION_MINOR 0
-#define VERSION_TAG "-ALPHA5"
+#define VERSION_TAG "-ALPHA6"
#define LISTITEM_START 35000
#define LISTITEM_THUMB (LISTITEM_START)
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "ApplicationInfo.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
CJNIApplicationInfo::CJNIApplicationInfo(const jhobject &object) : CJNIBase(object)
- ,sourceDir(jcast<std::string>(get_field<jhstring>(m_object, "sourceDir")))
- ,publicSourceDir(jcast<std::string>(get_field<jhstring>(m_object, "publicSourceDir")))
- ,dataDir(jcast<std::string>(get_field<jhstring>(m_object, "dataDir")))
+ ,sourceDir( jcast<std::string>(get_field<jhstring>(m_object, "sourceDir")))
+ ,publicSourceDir( jcast<std::string>(get_field<jhstring>(m_object, "publicSourceDir")))
+ ,dataDir( jcast<std::string>(get_field<jhstring>(m_object, "dataDir")))
,nativeLibraryDir(jcast<std::string>(get_field<jhstring>(m_object, "nativeLibraryDir")))
- ,packageName(jcast<std::string>(get_field<jhstring>(m_object, "packageName")))
- ,uid(get_field<int>(m_object, "uid"))
+ ,packageName( jcast<std::string>(get_field<jhstring>(m_object, "packageName")))
+ ,uid( get_field<int>(m_object, "uid"))
,targetSdkVersion(get_field<int>(m_object, "targetSdkVersion"))
- ,enabled(get_field<jboolean>(m_object, "enabled"))
+ ,enabled( get_field<jboolean>(m_object, "enabled"))
{
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIApplicationInfo : public CJNIBase
std::string dataDir;
std::string nativeLibraryDir;
std::string packageName;
- int uid;
- int targetSdkVersion;
- bool enabled;
+ int uid;
+ int targetSdkVersion;
+ bool enabled;
private:
CJNIApplicationInfo();
};
+
typedef std::vector<CJNIApplicationInfo> CJNIApplicationInfos;
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "AudioManager.h"
#include "jutils/jutils-details.hpp"
void CJNIAudioManager::PopulateStaticFields()
{
jhclass clazz = find_class("android/media/AudioManager");
- STREAM_MUSIC = (get_static_field<int>(clazz, "STREAM_MUSIC"));
+ STREAM_MUSIC = (get_static_field<int>(clazz, "STREAM_MUSIC"));
}
int CJNIAudioManager::getStreamMaxVolume()
{
- return call_method<jint>(m_object, "getStreamMaxVolume", "(I)I", STREAM_MUSIC);
+ return call_method<jint>(m_object,
+ "getStreamMaxVolume", "(I)I",
+ STREAM_MUSIC);
}
void CJNIAudioManager::setStreamVolume(int index /* 0 */, int flags /* NONE */)
{
- call_method<void>(m_object, "setStreamVolume", "(III)V", STREAM_MUSIC, index, flags);
+ call_method<void>(m_object,
+ "setStreamVolume", "(III)V",
+ STREAM_MUSIC, index, flags);
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIAudioManager : public CJNIBase
{
public:
+ CJNIAudioManager(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIAudioManager() {};
+
// Note removal of streamType param.
- int getStreamMaxVolume();
+ int getStreamMaxVolume();
void setStreamVolume(int index = 0, int flags = 0);
static void PopulateStaticFields();
- ~CJNIAudioManager(){};
- CJNIAudioManager(const jni::jhobject &object) : CJNIBase(object){};
private:
CJNIAudioManager();
+
static int STREAM_MUSIC;
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "BaseColumns.h"
#include "jutils/jutils-details.hpp"
void CJNIBaseColumns::PopulateStaticFields()
{
jhclass clazz = find_class("android/provider/BaseColumns");
- _ID = (jcast<std::string>(get_static_field<jhstring>(clazz, "_ID")));
+ _ID = (jcast<std::string>(get_static_field<jhstring>(clazz, "_ID")));
_COUNT = (jcast<std::string>(get_static_field<jhstring>(clazz, "_COUNT")));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include <string>
+
class CJNIBaseColumns
{
public:
+ static void PopulateStaticFields();
+
static std::string _ID;
static std::string _COUNT;
- static void PopulateStaticFields();
+
private:
CJNIBaseColumns();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "BitSet.h"
#include "jutils/jutils-details.hpp"
CJNIBitSet::CJNIBitSet(int bitCount) : CJNIBase("java.util.BitSet")
{
- m_object = new_object(GetClassName(), "<init>", "(I)V", (jint)bitCount);
+ m_object = new_object(GetClassName(),
+ "<init>", "(I)V",
+ (jint)bitCount);
}
void CJNIBitSet::flip(int index)
{
- call_method<void>(m_object, "flip", "(I)V", index);
+ call_method<void>(m_object,
+ "flip", "(I)V",
+ index);
}
void CJNIBitSet::flip(int fromIndex, int toIndex)
{
- call_method<void>(m_object, "flip", "(II)V", fromIndex, toIndex);
+ call_method<void>(m_object,
+ "flip", "(II)V",
+ fromIndex, toIndex);
}
void CJNIBitSet::set(int index)
void CJNIBitSet::set(int fromIndex, bool state)
{
- call_method<void>(m_object, "fromIndex", "(IZ)V", fromIndex, state);
+ call_method<void>(m_object,
+ "fromIndex", "(IZ)V",
+ fromIndex, state);
}
void CJNIBitSet::set(int fromIndex, int toIndex)
{
- call_method<void>(m_object, "set", "(II)V", fromIndex, toIndex);
+ call_method<void>(m_object,
+ "set", "(II)V",
+ fromIndex, toIndex);
}
void CJNIBitSet::set(int fromIndex, int toIndex, bool state)
{
- call_method<void>(m_object, "set", "(IIZ)V", fromIndex, toIndex, state);
+ call_method<void>(m_object,
+ "set", "(IIZ)V",
+ fromIndex, toIndex, state);
}
void CJNIBitSet::clear(int index)
{
- call_method<void>(m_object, "clear", "(I)V", index);
+ call_method<void>(m_object,
+ "clear", "(I)V",
+ index);
}
void CJNIBitSet::clear(int fromIndex, int toIndex)
{
- call_method<void>(m_object, "clear", "(II)V", fromIndex, toIndex);
+ call_method<void>(m_object,
+ "clear", "(II)V",
+ fromIndex, toIndex);
}
void CJNIBitSet::clear()
{
- call_method<void>(m_object, "clear", "()V");
+ call_method<void>(m_object,
+ "clear", "()V");
}
bool CJNIBitSet::get(int index)
{
- return call_method<jboolean>(m_object, "get", "(I)V", index);
+ return call_method<jboolean>(m_object,
+ "get", "(I)V",
+ index);
}
CJNIBitSet CJNIBitSet::get(int fromIndex, int toIndex)
{
- return call_method<jhobject>(m_object, "get", "(II)V", fromIndex, toIndex);
+ return call_method<jhobject>(m_object,
+ "get", "(II)V",
+ fromIndex, toIndex);
}
int CJNIBitSet::nextSetBit(int index)
{
- return call_method<jint>(m_object, "nextSetBit", "(I)I", index);
+ return call_method<jint>(m_object,
+ "nextSetBit", "(I)I",
+ index);
}
int CJNIBitSet::nextClearBit(int index)
{
- return call_method<jint>(m_object, "nextClearBit", "(I)I", index);
+ return call_method<jint>(m_object,
+ "nextClearBit", "(I)I",
+ index);
}
int CJNIBitSet::length()
{
- return call_method<jint>(m_object, "length", "()I");
+ return call_method<jint>(m_object,
+ "length", "()I");
}
bool CJNIBitSet::isEmpty()
{
- return call_method<jboolean>(m_object, "isEmpty", "()Z");
+ return call_method<jboolean>(m_object,
+ "isEmpty", "()Z");
}
bool CJNIBitSet::intersects(const CJNIBitSet &bs)
{
- return call_method<jboolean>(m_object, "intersects", "(Ljava/util/BitSet;)Z", bs.get_raw());
+ return call_method<jboolean>(m_object,
+ "intersects", "(Ljava/util/BitSet;)Z",
+ bs.get_raw());
}
int CJNIBitSet::cardinality()
{
- return call_method<jint>(m_object, "cardinality", "()I");
+ return call_method<jint>(m_object,
+ "cardinality", "()I");
}
void CJNIBitSet::jand(const CJNIBitSet &bs)
{
- call_method<void>(m_object, "jand", "(Ljava/util/BitSet;)V", bs.get_raw());
+ call_method<void>(m_object,
+ "jand", "(Ljava/util/BitSet;)V",
+ bs.get_raw());
}
void CJNIBitSet::jor(const CJNIBitSet &bs)
{
- call_method<void>(m_object, "jor", "(Ljava/util/BitSet;)V", bs.get_raw());
+ call_method<void>(m_object,
+ "jor", "(Ljava/util/BitSet;)V",
+ bs.get_raw());
}
void CJNIBitSet::jxor(const CJNIBitSet &bs)
{
- call_method<void>(m_object, "jxor", "(Ljava/util/BitSet;)V", bs.get_raw());
+ call_method<void>(m_object,
+ "jxor", "(Ljava/util/BitSet;)V",
+ bs.get_raw());
}
void CJNIBitSet::jandNot(const CJNIBitSet &bs)
{
- call_method<void>(m_object, "jandNot", "(Ljava/util/BitSet;)V", bs.get_raw());
+ call_method<void>(m_object,
+ "jandNot", "(Ljava/util/BitSet;)V",
+ bs.get_raw());
}
int CJNIBitSet::hashCode()
{
- return call_method<jint>(m_object, "hashCode", "()I");
+ return call_method<jint>(m_object,
+ "hashCode", "()I");
}
int CJNIBitSet::size()
{
- return call_method<jint>(m_object, "size", "()I");
+ return call_method<jint>(m_object,
+ "size", "()I");
}
std::string CJNIBitSet::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
-
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIBitSet : public CJNIBase
{
public:
- ~CJNIBitSet(){};
- CJNIBitSet(const jni::jhobject &object) : CJNIBase(object){};
CJNIBitSet();
CJNIBitSet(int);
+ CJNIBitSet(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIBitSet() {};
void flip(int);
void flip(int, int);
void clear();
bool get(int);
CJNIBitSet get(int, int);
- int nextSetBit(int);
- int nextClearBit(int);
- int length();
+ int nextSetBit(int);
+ int nextClearBit(int);
+ int length();
bool isEmpty();
bool intersects(const CJNIBitSet &);
- int cardinality();
+ int cardinality();
void jand(const CJNIBitSet &);
void jor(const CJNIBitSet &);
void jxor(const CJNIBitSet &);
void jandNot(const CJNIBitSet &);
- int hashCode();
- int size();
+ int hashCode();
+ int size();
std::string toString();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIBitmap : public CJNIBase
{
public:
CJNIBitmap();
- ~CJNIBitmap(){};
- CJNIBitmap(const jni::jhobject &object) : CJNIBase(object){};
-
+ CJNIBitmap(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIBitmap() {};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "BitmapDrawable.h"
#include "Bitmap.h"
#include "jutils/jutils-details.hpp"
CJNIBitmap CJNIBitmapDrawable::getBitmap()
{
- return (CJNIBitmap)call_method<jhobject>(m_object, "getBitmap", "()Landroid/graphics/Bitmap;");
+ return call_method<jhobject>(m_object,
+ "getBitmap", "()Landroid/graphics/Bitmap;");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Drawable.h"
+
class CJNIBitmap;
+
class CJNIBitmapDrawable : public CJNIDrawable
{
public:
CJNIBitmapDrawable();
- CJNIBitmapDrawable(const jni::jhobject &object) : CJNIDrawable(object){};
- CJNIBitmapDrawable(const CJNIDrawable &drawable) : CJNIDrawable(drawable.get_raw()){};
+ CJNIBitmapDrawable(const jni::jhobject &object) : CJNIDrawable(object) {};
+ CJNIBitmapDrawable(const CJNIDrawable &drawable) : CJNIDrawable(drawable.get_raw()) {};
+ ~CJNIBitmapDrawable() {};
+
CJNIBitmap getBitmap();
- ~CJNIBitmapDrawable(){};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIIntent;
+
class CJNIBroadcastReceiver : public CJNIBase
{
public:
static void _onReceive(JNIEnv *env, jobject context, jobject intent);
protected:
- virtual void onReceive(CJNIIntent intent)=0;
- ~CJNIBroadcastReceiver(){};
CJNIBroadcastReceiver(const std::string &className);
+ ~CJNIBroadcastReceiver(){};
+
+ virtual void onReceive(CJNIIntent intent)=0;
private:
- static CJNIBroadcastReceiver* m_receiverInstance;
+ static CJNIBroadcastReceiver *m_receiverInstance;
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "CharSequence.h"
#include "jutils/jutils-details.hpp"
+
using namespace jni;
std::string CJNICharSequence::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNICharSequence : public CJNIBase
{
public:
- ~CJNICharSequence(){};
- CJNICharSequence(const jni::jhobject &object) : CJNIBase(object){};
+ CJNICharSequence(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNICharSequence() {};
+
std::string toString();
+
private:
CJNICharSequence();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "ClassLoader.h"
#include "jutils/jutils-details.hpp"
+
using namespace jni;
jhclass CJNIClassLoader::loadClass(std::string className)
{
- return (jhclass)call_method<jhclass>(m_object, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;", jcast<jhstring>(className));
+ return call_method<jhclass>(m_object,
+ "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;",
+ jcast<jhstring>(className));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIClassLoader : public CJNIBase
{
public:
- ~CJNIClassLoader(){};
+ CJNIClassLoader(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIClassLoader() {};
+
jni::jhclass loadClass(std::string className);
- CJNIClassLoader(const jni::jhobject &object) : CJNIBase(object){};
+
private:
CJNIClassLoader();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "ConnectivityManager.h"
#include "NetworkInfo.h"
#include "jutils/jutils-details.hpp"
+using namespace jni;
+
int CJNIConnectivityManager::TYPE_MOBILE(0);
int CJNIConnectivityManager::TYPE_WIFI(0);
int CJNIConnectivityManager::TYPE_MOBILE_MMS(0);
int CJNIConnectivityManager::TYPE_DUMMY(0);
int CJNIConnectivityManager::TYPE_ETHERNET(0);
int CJNIConnectivityManager::DEFAULT_NETWORK_PREFERENCE(0);
-using namespace jni;
void CJNIConnectivityManager::PopulateStaticFields()
{
jhclass clazz = find_class("android.net.ConnectivityManager");
- TYPE_MOBILE = (get_static_field<int>(clazz, "TYPE_MOBILE"));
- TYPE_WIFI = (get_static_field<int>(clazz, "TYPE_WIFI"));
- TYPE_MOBILE_MMS = (get_static_field<int>(clazz, "TYPE_MOBILE_MMS"));
- TYPE_MOBILE_SUPL = (get_static_field<int>(clazz, "TYPE_MOBILE_SUPL"));
- TYPE_MOBILE_DUN = (get_static_field<int>(clazz, "TYPE_MOBILE_DUN"));
+ TYPE_MOBILE = (get_static_field<int>(clazz, "TYPE_MOBILE"));
+ TYPE_WIFI = (get_static_field<int>(clazz, "TYPE_WIFI"));
+ TYPE_MOBILE_MMS = (get_static_field<int>(clazz, "TYPE_MOBILE_MMS"));
+ TYPE_MOBILE_SUPL = (get_static_field<int>(clazz, "TYPE_MOBILE_SUPL"));
+ TYPE_MOBILE_DUN = (get_static_field<int>(clazz, "TYPE_MOBILE_DUN"));
TYPE_MOBILE_HIPRI = (get_static_field<int>(clazz, "TYPE_MOBILE_HIPRI"));
- TYPE_WIMAX = (get_static_field<int>(clazz, "TYPE_WIMAX"));
- TYPE_BLUETOOTH = (get_static_field<int>(clazz, "TYPE_BLUETOOTH"));
- TYPE_DUMMY = (get_static_field<int>(clazz, "TYPE_DUMMY"));
- TYPE_ETHERNET = (get_static_field<int>(clazz, "TYPE_ETHERNET"));
+ TYPE_WIMAX = (get_static_field<int>(clazz, "TYPE_WIMAX"));
+ TYPE_BLUETOOTH = (get_static_field<int>(clazz, "TYPE_BLUETOOTH"));
+ TYPE_DUMMY = (get_static_field<int>(clazz, "TYPE_DUMMY"));
+ TYPE_ETHERNET = (get_static_field<int>(clazz, "TYPE_ETHERNET"));
DEFAULT_NETWORK_PREFERENCE = (get_static_field<int>(clazz, "DEFAULT_NETWORK_PREFERENCE"));
}
bool CJNIConnectivityManager::isNetworkTypeValid(int networkType)
{
- return call_method<jboolean>(m_object, "isNetworkTypeValid", "(I)Z", networkType);
+ return call_method<jboolean>(m_object,
+ "isNetworkTypeValid", "(I)Z",
+ networkType);
}
void CJNIConnectivityManager::setNetworkPreference(int preference)
{
- return call_method<void>(m_object, "setNetworkPreference", "(I)V", preference);
+ return call_method<void>(m_object,
+ "setNetworkPreference", "(I)V",
+ preference);
}
int CJNIConnectivityManager::getNetworkPreference()
{
- return call_method<jint>(m_object, "getNetworkPreference", "()I");
+ return call_method<jint>(m_object,
+ "getNetworkPreference", "()I");
}
CJNINetworkInfo CJNIConnectivityManager::getActiveNetworkInfo()
{
- return (CJNINetworkInfo)call_method<jhobject>(m_object, "getActiveNetworkInfo", "()Landroid/net/NetworkInfo;");
+ return call_method<jhobject>(m_object,
+ "getActiveNetworkInfo", "()Landroid/net/NetworkInfo;");
}
CJNINetworkInfo CJNIConnectivityManager::getNetworkInfo(int networkType)
{
- return (CJNINetworkInfo)call_method<jhobject>(m_object, "getNetworkInfo", "(I)Landroid/net/NetworkInfo;", networkType);
+ return call_method<jhobject>(m_object,
+ "getNetworkInfo", "(I)Landroid/net/NetworkInfo;",
+ networkType);
}
std::vector<CJNINetworkInfo> CJNIConnectivityManager::getAllNetworkInfo()
{
JNIEnv *env = xbmc_jnienv();
- jhobjectArray oNetworks = call_method<jhobjectArray>(m_object, "getAllNetworkInfo", "()[Landroid/net/NetworkInfo;");
+
+ jhobjectArray oNetworks = call_method<jhobjectArray>(m_object,
+ "getAllNetworkInfo", "()[Landroid/net/NetworkInfo;");
jsize size = env->GetArrayLength(oNetworks.get());
std::vector<CJNINetworkInfo> networks;
networks.reserve(size);
for(int i = 0; i < size; i++)
- {
networks.push_back(CJNINetworkInfo(jhobject(env->GetObjectArrayElement(oNetworks.get(), i))));
- }
+
return networks;
}
int CJNIConnectivityManager::startUsingNetworkFeature(int networkType, std::string feature)
{
- return call_method<jint>(m_object, "startUsingNetworkFeature", "(ILjava/lang/String;)I", networkType, jcast<jhstring>(feature));
+ return call_method<jint>(m_object,
+ "startUsingNetworkFeature", "(ILjava/lang/String;)I",
+ networkType, jcast<jhstring>(feature));
}
int CJNIConnectivityManager::stopUsingNetworkFeature(int networkType, std::string feature)
{
- return call_method<jint>(m_object, "stopUsingNetworkFeature", "(ILjava/lang/String;)I", networkType, jcast<jhstring>(feature));
+ return call_method<jint>(m_object,
+ "stopUsingNetworkFeature", "(ILjava/lang/String;)I",
+ networkType, jcast<jhstring>(feature));
}
bool CJNIConnectivityManager::requestRouteToHost(int networkType, int hostAddress)
{
- return call_method<jboolean>(m_object, "requestRouteToHost", "(II)Z", networkType, hostAddress);
+ return call_method<jboolean>(m_object,
+ "requestRouteToHost", "(II)Z",
+ networkType, hostAddress);
}
bool CJNIConnectivityManager::getBackgroundDataSetting()
{
- return call_method<jboolean>(m_object, "getBackgroundDataSetting", "()Z");
+ return call_method<jboolean>(m_object,
+ "getBackgroundDataSetting", "()Z");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNINetworkInfo;
+
class CJNIConnectivityManager : public CJNIBase
{
public:
- CJNIConnectivityManager(const jni::jhobject &object) : CJNIBase(object){};
+ CJNIConnectivityManager(const jni::jhobject &object) : CJNIBase(object) {};
+
bool isNetworkTypeValid(int);
void setNetworkPreference(int);
- int getNetworkPreference();
+ int getNetworkPreference();
CJNINetworkInfo getActiveNetworkInfo();
CJNINetworkInfo getNetworkInfo(int);
std::vector<CJNINetworkInfo> getAllNetworkInfo();
- int startUsingNetworkFeature(int, std::string);
- int stopUsingNetworkFeature(int, std::string);
+ int startUsingNetworkFeature(int, std::string);
+ int stopUsingNetworkFeature(int, std::string);
bool requestRouteToHost(int, int);
bool getBackgroundDataSetting();
+ static void PopulateStaticFields();
static int TYPE_MOBILE;
static int TYPE_WIFI;
static int TYPE_MOBILE_MMS;
static int TYPE_ETHERNET;
static int DEFAULT_NETWORK_PREFERENCE;
- static void PopulateStaticFields();
+
private:
CJNIConnectivityManager();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "ContentResolver.h"
#include "Cursor.h"
#include "jutils/jutils-details.hpp"
#include "URI.h"
+
+using namespace jni;
+
std::string CJNIContentResolver::SCHEME_CONTENT;
std::string CJNIContentResolver::SCHEME_ANDROID_RESOURCE;
std::string CJNIContentResolver::SCHEME_FILE;
std::string CJNIContentResolver::CURSOR_ITEM_BASE_TYPE;
std::string CJNIContentResolver::CURSOR_DIR_BASE_TYPE;
-using namespace jni;
void CJNIContentResolver::PopulateStaticFields()
{
jhclass clazz = find_class("android/content/ContentResolver");
- SCHEME_CONTENT = jcast<std::string>(get_static_field<jhstring>(clazz,"SCHEME_CONTENT"));
+ SCHEME_CONTENT = jcast<std::string>(get_static_field<jhstring>(clazz,"SCHEME_CONTENT"));
SCHEME_ANDROID_RESOURCE = jcast<std::string>(get_static_field<jhstring>(clazz,"SCHEME_ANDROID_RESOURCE"));
- SCHEME_FILE = jcast<std::string>(get_static_field<jhstring>(clazz,"SCHEME_FILE"));
- CURSOR_ITEM_BASE_TYPE = jcast<std::string>(get_static_field<jhstring>(clazz,"CURSOR_ITEM_BASE_TYPE"));
- CURSOR_DIR_BASE_TYPE = jcast<std::string>(get_static_field<jhstring>(clazz,"CURSOR_DIR_BASE_TYPE"));
+ SCHEME_FILE = jcast<std::string>(get_static_field<jhstring>(clazz,"SCHEME_FILE"));
+ CURSOR_ITEM_BASE_TYPE = jcast<std::string>(get_static_field<jhstring>(clazz,"CURSOR_ITEM_BASE_TYPE"));
+ CURSOR_DIR_BASE_TYPE = jcast<std::string>(get_static_field<jhstring>(clazz,"CURSOR_DIR_BASE_TYPE"));
}
CJNICursor CJNIContentResolver::query(const CJNIURI &uri, const std::vector<std::string> &projection, const std::string &selection, const std::vector<std::string> &selectionArgs, const std::string &sortOrder)
{
-
- return (CJNICursor)(call_method<jhobject>(m_object, \
- "query","(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;", \
- uri.get_raw(), jcast<jhobjectArray>(projection), jcast<jhstring>(selection), jcast<jhobjectArray>(selectionArgs), jcast<jhstring>(sortOrder)));
+ return (CJNICursor)(call_method<jhobject>(m_object,
+ "query","(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;",
+ uri.get_raw(), jcast<jhobjectArray>(projection), jcast<jhstring>(selection), jcast<jhobjectArray>(selectionArgs), jcast<jhstring>(sortOrder)));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNICursor;
class CJNIURI;
+
class CJNIContentResolver : public CJNIBase
{
public:
- CJNIContentResolver(const jni::jhobject &object) : CJNIBase(object){};
+ CJNIContentResolver(const jni::jhobject &object) : CJNIBase(object) {};
+
+ CJNICursor query(const CJNIURI &uri, const std::vector<std::string> &projection, const std::string &selection, const std::vector<std::string> &selectionArgs, const std::string &sortOrder);
+ static void PopulateStaticFields();
static std::string SCHEME_CONTENT;
static std::string SCHEME_ANDROID_RESOURCE;
static std::string SCHEME_FILE;
static std::string CURSOR_ITEM_BASE_TYPE;
static std::string CURSOR_DIR_BASE_TYPE;
- CJNICursor query(const CJNIURI &uri, const std::vector<std::string> &projection, const std::string &selection, const std::vector<std::string> &selectionArgs, const std::string &sortOrder);
-
- static void PopulateStaticFields();
private:
CJNIContentResolver();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Context.h"
#include "PackageManager.h"
#include <android/log.h>
#include "Cursor.h"
#include "ConnectivityManager.h"
#include "AudioManager.h"
+
#include <android/native_activity.h>
using namespace jni;
jhobject CJNIContext::m_context(0);
CJNIContext* CJNIContext::m_appInstance(NULL);
+
CJNIContext::CJNIContext(const ANativeActivity *nativeActivity)
{
m_context.reset(nativeActivity->clazz);
CJNIContentResolver::PopulateStaticFields();
CJNIConnectivityManager::PopulateStaticFields();
CJNIAudioManager::PopulateStaticFields();
-
}
CJNIPackageManager CJNIContext::GetPackageManager()
{
- return (CJNIPackageManager)call_method<jhobject>(m_context, "getPackageManager", "()Landroid/content/pm/PackageManager;");
+ return call_method<jhobject>(m_context,
+ "getPackageManager", "()Landroid/content/pm/PackageManager;");
}
void CJNIContext::startActivity(const CJNIIntent &intent)
{
- call_method<void>(jhobject(m_context), "startActivity", "(Landroid/content/Intent;)V", intent.get_raw());
+ call_method<void>(jhobject(m_context),
+ "startActivity", "(Landroid/content/Intent;)V",
+ intent.get_raw());
}
int CJNIContext::checkCallingOrSelfPermission(const std::string &permission)
{
- return call_method<int>(m_context, "checkCallingOrSelfPermission", "(Ljava/lang/String;)I", jcast<jhstring>(permission));
+ return call_method<int>(m_context,
+ "checkCallingOrSelfPermission", "(Ljava/lang/String;)I",
+ jcast<jhstring>(permission));
}
jhobject CJNIContext::getSystemService(const std::string &service)
{
- return call_method<jhobject>(m_context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", jcast<jhstring>(service));
+ return call_method<jhobject>(m_context,
+ "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",
+ jcast<jhstring>(service));
}
CJNIIntent CJNIContext::registerReceiver(const CJNIBroadcastReceiver &receiver, const CJNIIntentFilter &filter)
{
- return (CJNIIntent)call_method<jhobject>(m_context, "registerReceiver", \
- "(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;", receiver.get_raw(), filter.get_raw());
+ return call_method<jhobject>(m_context,
+ "registerReceiver", "(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;",
+ receiver.get_raw(), filter.get_raw());
}
CJNIIntent CJNIContext::registerReceiver(const CJNIIntentFilter &filter)
{
- return (CJNIIntent)call_method<jhobject>(m_context, "registerReceiver", \
- "(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;", (jobject)NULL, filter.get_raw());
+ return call_method<jhobject>(m_context,
+ "registerReceiver", "(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;",
+ (jobject)NULL, filter.get_raw());
}
void CJNIContext::unregisterReceiver(const CJNIBroadcastReceiver &receiver)
{
- call_method<void>(m_context, "unregisterReceiver", "(Landroid/content/BroadcastReceiver;)V", receiver.get_raw());
+ call_method<void>(m_context,
+ "unregisterReceiver", "(Landroid/content/BroadcastReceiver;)V",
+ receiver.get_raw());
}
CJNIIntent CJNIContext::sendBroadcast(const CJNIIntent &intent)
{
- return (CJNIIntent)call_method<jhobject>(m_context, "sendBroadcast", "(Landroid/content/Intent;)V", intent.get_raw());
+ return call_method<jhobject>(m_context,
+ "sendBroadcast", "(Landroid/content/Intent;)V",
+ intent.get_raw());
}
CJNIIntent CJNIContext::getIntent()
{
- return (CJNIIntent)call_method<jhobject>(m_context, "getIntent", "()Landroid/content/Intent;");
+ return call_method<jhobject>(m_context,
+ "getIntent", "()Landroid/content/Intent;");
}
CJNIClassLoader CJNIContext::getClassLoader()
{
- return (CJNIClassLoader)call_method<jhobject>(m_context, "getClassLoader", "()Ljava/lang/ClassLoader;");
+ return call_method<jhobject>(m_context,
+ "getClassLoader", "()Ljava/lang/ClassLoader;");
}
CJNIApplicationInfo CJNIContext::getApplicationInfo()
{
- return (CJNIApplicationInfo)call_method<jhobject>(m_context, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;");
+ return call_method<jhobject>(m_context,
+ "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;");
}
std::string CJNIContext::getPackageResourcePath()
{
- return jcast<std::string>(call_method<jhstring>(m_context, "getPackageResourcePath", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_context,
+ "getPackageResourcePath", "()Ljava/lang/String;"));
}
CJNIFile CJNIContext::getCacheDir()
{
- return (CJNIFile)call_method<jhobject>(m_context, "getCacheDir", "()Ljava/io/File;");
+ return call_method<jhobject>(m_context,
+ "getCacheDir", "()Ljava/io/File;");
}
CJNIFile CJNIContext::getDir(const std::string &path, int mode)
{
- return (CJNIFile)call_method<jhobject>(m_context, "getDir", "(Ljava/lang/String;I)Ljava/io/File;", jcast<jhstring>(path), mode);
+ return call_method<jhobject>(m_context,
+ "getDir", "(Ljava/lang/String;I)Ljava/io/File;",
+ jcast<jhstring>(path), mode);
}
CJNIFile CJNIContext::getExternalFilesDir(const std::string &path)
{
- return (CJNIFile)call_method<jhobject>(m_context, "getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;", jcast<jhstring>(path));
+ return call_method<jhobject>(m_context,
+ "getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;",
+ jcast<jhstring>(path));
}
CJNIContentResolver CJNIContext::getContentResolver()
{
- return (CJNIContentResolver)call_method<jhobject>(m_context, "getContentResolver", "()Landroid/content/ContentResolver;");
+ return call_method<jhobject>(m_context,
+ "getContentResolver", "()Landroid/content/ContentResolver;");
}
void CJNIContext::_onNewIntent(JNIEnv *env, jobject context, jobject intent)
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "BroadcastReceiver.h"
+
class ANativeActivity;
class CJNIIntent;
class CJNIPackageManager;
class CJNIApplicationInfo;
class CJNIFile;
class CJNIContentResolver;
+
class CJNIContext
{
public:
static CJNIContentResolver getContentResolver();
static CJNIContext* GetAppInstance() { return m_appInstance; };
static void _onNewIntent(JNIEnv *env, jobject context, jobject intent);
+
protected:
- virtual void onNewIntent(CJNIIntent intent)=0;
CJNIContext(const ANativeActivity *nativeActivity);
~CJNIContext();
+ virtual void onNewIntent(CJNIIntent intent)=0;
+
private:
CJNIContext();
+
void PopulateStaticFields();
void operator=(CJNIContext const&){};
static jni::jhobject m_context;
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Cursor.h"
#include "jutils/jutils-details.hpp"
#include "URI.h"
void CJNICursor::PopulateStaticFields()
{
jhclass clazz = find_class("android/database/Cursor");
- FIELD_TYPE_NULL = (get_static_field<int>(clazz, "FIELD_TYPE_NULL"));
- FIELD_TYPE_INTEGER = (get_static_field<int>(clazz, "FIELD_TYPE_INTEGER"));
- FIELD_TYPE_FLOAT = (get_static_field<int>(clazz, "FIELD_TYPE_FLOAT"));
- FIELD_TYPE_STRING = (get_static_field<int>(clazz, "FIELD_TYPE_STRING"));
- FIELD_TYPE_BLOB = (get_static_field<int>(clazz, "FIELD_TYPE_BLOB"));
+ FIELD_TYPE_NULL = (get_static_field<int>(clazz, "FIELD_TYPE_NULL"));
+ FIELD_TYPE_INTEGER = (get_static_field<int>(clazz, "FIELD_TYPE_INTEGER"));
+ FIELD_TYPE_FLOAT = (get_static_field<int>(clazz, "FIELD_TYPE_FLOAT"));
+ FIELD_TYPE_STRING = (get_static_field<int>(clazz, "FIELD_TYPE_STRING"));
+ FIELD_TYPE_BLOB = (get_static_field<int>(clazz, "FIELD_TYPE_BLOB"));
}
int CJNICursor::getCount()
{
- return call_method<jint>(m_object, "getCount", "()I");
+ return call_method<jint>(m_object,
+ "getCount", "()I");
}
int CJNICursor::getPosition()
{
- return call_method<jint>(m_object, "getPosition", "()I");
+ return call_method<jint>(m_object,
+ "getPosition", "()I");
}
bool CJNICursor::move(int offset)
{
- return call_method<jboolean>(m_object, "move", "(I)Z", offset);
+ return call_method<jboolean>(m_object,
+ "move", "(I)Z",
+ offset);
}
bool CJNICursor::moveToPosition(int position)
{
- return call_method<jboolean>(m_object, "moveToPosition", "(I)Z", position);
+ return call_method<jboolean>(m_object,
+ "moveToPosition", "(I)Z", position);
}
bool CJNICursor::moveToFirst()
{
- return call_method<jboolean>(m_object, "moveToFirst", "()Z");
+ return call_method<jboolean>(m_object,
+ "moveToFirst", "()Z");
}
bool CJNICursor::moveToLast()
{
- return call_method<jboolean>(m_object, "moveToLast", "()Z");
+ return call_method<jboolean>(m_object,
+ "moveToLast", "()Z");
}
bool CJNICursor::moveToNext()
{
- return call_method<jboolean>(m_object, "moveToNext", "()Z");
+ return call_method<jboolean>(m_object,
+ "moveToNext", "()Z");
}
bool CJNICursor::moveToPrevious()
{
- return call_method<jboolean>(m_object, "moveToPrevious", "()Z");
+ return call_method<jboolean>(m_object,
+ "moveToPrevious", "()Z");
}
bool CJNICursor::isFirst()
{
- return call_method<jboolean>(m_object, "isFirst", "()Z");
+ return call_method<jboolean>(m_object,
+ "isFirst", "()Z");
}
bool CJNICursor::isLast()
{
- return call_method<jboolean>(m_object, "isLast", "()Z");
+ return call_method<jboolean>(m_object,
+ "isLast", "()Z");
}
bool CJNICursor::isBeforeFirst()
{
- return call_method<jboolean>(m_object, "isBeforeFirst", "()Z");
+ return call_method<jboolean>(m_object,
+ "isBeforeFirst", "()Z");
}
bool CJNICursor::isAfterLast()
{
- return call_method<jboolean>(m_object, "isAfterLast", "()Z");
+ return call_method<jboolean>(m_object,
+ "isAfterLast", "()Z");
}
int CJNICursor::getColumnIndex(const std::string &columnName)
{
- return call_method<jint>(m_object, "getColumnIndex", "(Ljava/lang/String;)I", jcast<jhstring>(columnName));
+ return call_method<jint>(m_object,
+ "getColumnIndex", "(Ljava/lang/String;)I",
+ jcast<jhstring>(columnName));
}
std::string CJNICursor::getColumnName(int columnIndex)
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getColumnName", "(I)Ljava/lang/String;", columnIndex));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getColumnName", "(I)Ljava/lang/String;",
+ columnIndex));
}
std::vector<std::string> CJNICursor::getColumnNames()
{
- return jcast<std::vector<std::string>>(call_method<jhobjectArray>(m_object, "getColumnNames", "()[Ljava/lang/String;"));
+ return jcast<std::vector<std::string>>(call_method<jhobjectArray>(m_object,
+ "getColumnNames", "()[Ljava/lang/String;"));
}
int CJNICursor::getColumnCount()
{
- return call_method<jint>(m_object, "getColumnCount", "()I");
+ return call_method<jint>(m_object,
+ "getColumnCount", "()I");
}
std::string CJNICursor::getString(int columnIndex)
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getString", "(I)Ljava/lang/String;", columnIndex));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getString", "(I)Ljava/lang/String;",
+ columnIndex));
}
short CJNICursor::getShort(int columnIndex)
{
- return call_method<jshort>(m_object, "getShort", "()S", columnIndex);
+ return call_method<jshort>(m_object,
+ "getShort", "()S",
+ columnIndex);
}
int CJNICursor::getInt(int columnIndex)
{
- return call_method<jint>(m_object, "getInt", "()I", columnIndex);
+ return call_method<jint>(m_object,
+ "getInt", "()I",
+ columnIndex);
}
long CJNICursor::getLong(int columnIndex)
{
- return call_method<jint>(m_object, "getLong", "()J", columnIndex);
+ return call_method<jint>(m_object,
+ "getLong", "()J",
+ columnIndex);
}
float CJNICursor::getFloat(int columnIndex)
{
- return call_method<jfloat>(m_object, "getFloat", "()F", columnIndex);
+ return call_method<jfloat>(m_object,
+ "getFloat", "()F",
+ columnIndex);
}
double CJNICursor::getDouble(int columnIndex)
{
- return call_method<jdouble>(m_object, "getDouble", "()D", columnIndex);
+ return call_method<jdouble>(m_object,
+ "getDouble", "()D",
+ columnIndex);
}
int CJNICursor::getType(int columnIndex)
{
- return call_method<jint>(m_object, "getType", "(I)I", columnIndex);
+ return call_method<jint>(m_object,
+ "getType", "(I)I",
+ columnIndex);
}
bool CJNICursor::isNull(int columnIndex)
{
- return call_method<jboolean>(m_object, "isNull", "(I)Z", columnIndex);
+ return call_method<jboolean>(m_object,
+ "isNull", "(I)Z",
+ columnIndex);
}
void CJNICursor::deactivate()
{
- call_method<void>(m_object, "deactivate", "()V");
+ call_method<void>(m_object,
+ "deactivate", "()V");
}
bool CJNICursor::requery()
{
- return call_method<jboolean>(m_object, "requery", "()Z");
+ return call_method<jboolean>(m_object,
+ "requery", "()Z");
}
void CJNICursor::close()
{
- call_method<void>(m_object, "close", "()V");
+ call_method<void>(m_object,
+ "close", "()V");
}
bool CJNICursor::isClosed()
{
- return call_method<jboolean>(m_object, "isClosed", "()Z");
+ return call_method<jboolean>(m_object,
+ "isClosed", "()Z");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "MediaStore.h"
+
class CJNIURI;
+
class CJNICursor : public CJNIBase
{
public:
- ~CJNICursor(){};
CJNICursor(const jni::jhobject &object) : CJNIBase(object){};
- int getCount();
- int getPosition();
+ ~CJNICursor(){};
+
+ int getCount();
+ int getPosition();
bool move(int offset);
bool moveToPosition(int position);
bool moveToFirst();
bool isLast();
bool isBeforeFirst();
bool isAfterLast();
- int getColumnIndex(const std::string &columnName);
+ int getColumnIndex(const std::string &columnName);
std::string getColumnName(int columnIndex);
std::vector<std::string> getColumnNames();
- int getColumnCount();
+ int getColumnCount();
std::string getString(int columnIndex);
short getShort(int columnIndex);
- int getInt(int columnIndex);
+ int getInt(int columnIndex);
long getLong(int columnIndex);
float getFloat(int columnIndex);
double getDouble(int columnIndex);
- int getType(int columnIndex);
+ int getType(int columnIndex);
bool isNull(int columnIndex);
void deactivate();
bool requery();
void close();
bool isClosed();
+ static void PopulateStaticFields();
static int FIELD_TYPE_NULL;
static int FIELD_TYPE_INTEGER;
static int FIELD_TYPE_FLOAT;
static int FIELD_TYPE_STRING;
static int FIELD_TYPE_BLOB;
- static void PopulateStaticFields();
+
private:
CJNICursor();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "DhcpInfo.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
CJNIDhcpInfo::CJNIDhcpInfo(const jhobject &object) : CJNIBase(object)
- ,ipAddress(get_field<int>(m_object, "ipAddress"))
- ,gateway(get_field<int>(m_object, "gateway"))
- ,netmask(get_field<int>(m_object, "netmask"))
- ,dns1(get_field<int>(m_object, "dns1"))
- ,dns2(get_field<int>(m_object, "dns2"))
- ,serverAddress(get_field<int>(m_object, "serverAddress"))
- ,leaseDuration(get_field<int>(m_object, "leaseDuration"))
+ ,ipAddress( get_field<int>(m_object, "ipAddress"))
+ ,gateway( get_field<int>(m_object, "gateway"))
+ ,netmask( get_field<int>(m_object, "netmask"))
+ ,dns1( get_field<int>(m_object, "dns1"))
+ ,dns2( get_field<int>(m_object, "dns2"))
+ ,serverAddress( get_field<int>(m_object, "serverAddress"))
+ ,leaseDuration( get_field<int>(m_object, "leaseDuration"))
{
}
std::string CJNIDhcpInfo::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
int CJNIDhcpInfo::describeContents()
{
- return call_method<jint>(m_object, "describeContents", "()I");
+ return call_method<jint>(m_object,
+ "describeContents", "()I");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIDhcpInfo : public CJNIBase
{
public:
+ CJNIDhcpInfo();
+ CJNIDhcpInfo(const jni::jhobject &object);
+ ~CJNIDhcpInfo(){};
+
std::string toString();
int ipAddress;
int gateway;
int serverAddress;
int leaseDuration;
int describeContents();
-
- CJNIDhcpInfo();
- ~CJNIDhcpInfo(){};
- CJNIDhcpInfo(const jni::jhobject &object);
-private:
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIDrawable : public CJNIBase
{
public:
CJNIDrawable();
- ~CJNIDrawable(){};
CJNIDrawable(const jni::jhobject &object) : CJNIBase(object){};
CJNIDrawable(std::string classname) : CJNIBase(classname){};
+ ~CJNIDrawable(){};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Enum.h"
#include "jutils/jutils-details.hpp"
std::string CJNIEnum::name()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "name", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "name", "()Ljava/lang/String;"));
}
std::string CJNIEnum::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
bool CJNIEnum::equals(const CJNIEnum &object)
{
- return call_method<jboolean>(m_object, "equals", "(Ljava/lang/Object;)Z", object.get_raw());
+ return call_method<jboolean>(m_object,
+ "equals", "(Ljava/lang/Object;)Z", object.get_raw());
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
+
class CJNIEnum : public CJNIBase
{
public:
- CJNIEnum(jni::jhobject const& object) : CJNIBase(object){};
+ CJNIEnum(jni::jhobject const& object) : CJNIBase(object) {};
+ ~CJNIEnum() {};
+
virtual std::string name();
virtual std::string toString();
virtual bool equals(const CJNIEnum &object);
- ~CJNIEnum(){};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Environment.h"
#include "File.h"
#include "jutils/jutils-details.hpp"
std::string CJNIEnvironment::getExternalStorageState()
{
- return jcast<std::string>(call_static_method<jhstring>("android/os/Environment", "getExternalStorageState", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_static_method<jhstring>("android/os/Environment",
+ "getExternalStorageState", "()Ljava/lang/String;"));
}
CJNIFile CJNIEnvironment::getExternalStorageDirectory()
{
- return (CJNIFile)call_static_method<jhobject>("android/os/Environment", "getExternalStorageDirectory", "()Ljava/io/File;");
+ return (CJNIFile)call_static_method<jhobject>("android/os/Environment",
+ "getExternalStorageDirectory", "()Ljava/io/File;");
}
CJNIFile CJNIEnvironment::getExternalStoragePublicDirectory(const std::string &type)
{
- return (CJNIFile)call_static_method<jhobject>("android/os/Environment", "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;", jcast<jhstring>(type));
+ return (CJNIFile)call_static_method<jhobject>("android/os/Environment",
+ "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;",
+ jcast<jhstring>(type));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIFile;
+
class CJNIEnvironment : public CJNIBase
{
public:
- static std::string getExternalStorageState();
- static CJNIFile getExternalStorageDirectory();
- static CJNIFile getExternalStoragePublicDirectory(const std::string &type);
+ static std::string getExternalStorageState();
+ static CJNIFile getExternalStorageDirectory();
+ static CJNIFile getExternalStoragePublicDirectory(const std::string &type);
+
protected:
CJNIEnvironment();
~CJNIEnvironment(){};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "File.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
+
std::string CJNIFile::getAbsolutePath()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getAbsolutePath", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getAbsolutePath", "()Ljava/lang/String;"));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIFile : public CJNIBase
{
public:
CJNIFile();
- ~CJNIFile(){};
CJNIFile(const jni::jhobject &file) : CJNIBase(file){};
+ ~CJNIFile(){};
std::string getAbsolutePath();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "Intent.h"
#include "jutils/jutils-details.hpp"
#include "URI.h"
if(action.empty())
m_object = new_object(GetClassName());
else
- m_object = new_object(GetClassName(), "<init>", "(Ljava/lang/String;)V", jcast<jhstring>(action));
+ m_object = new_object(GetClassName(),
+ "<init>", "(Ljava/lang/String;)V",
+ jcast<jhstring>(action));
}
std::string CJNIIntent::getAction()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getAction", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getAction", "()Ljava/lang/String;"));
}
std::string CJNIIntent::getDataString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getDataString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getDataString", "()Ljava/lang/String;"));
}
std::string CJNIIntent::getPackage()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getPackage", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getPackage", "()Ljava/lang/String;"));
}
std::string CJNIIntent::getType()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getType", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getType", "()Ljava/lang/String;"));
}
int CJNIIntent::getIntExtra(const std::string &name, int defaultValue)
{
- return call_method<jint>(m_object, "getIntExtra", "(Ljava/lang/String;I)I", jcast<jhstring>(name), defaultValue);
+ return call_method<jint>(m_object,
+ "getIntExtra", "(Ljava/lang/String;I)I",
+ jcast<jhstring>(name), defaultValue);
}
bool CJNIIntent::hasExtra(const std::string &name)
{
- return call_method<jboolean>(m_object, "hasExtra", "(Ljava/lang/String;)Z", jcast<jhstring>(name));
+ return call_method<jboolean>(m_object,
+ "hasExtra", "(Ljava/lang/String;)Z",
+ jcast<jhstring>(name));
}
bool CJNIIntent::hasCategory(const std::string &category)
{
- return call_method<jboolean>(m_object, "hasCategory", "(Ljava/lang/String;)Z", jcast<jhstring>(category));
+ return call_method<jboolean>(m_object,
+ "hasCategory", "(Ljava/lang/String;)Z",
+ jcast<jhstring>(category));
}
void CJNIIntent::addFlags(int flags)
{
- call_method<jhobject>(m_object, "addFlags", "(I;)Landroid/content/Intent;", flags);
+ call_method<jhobject>(m_object,
+ "addFlags", "(I;)Landroid/content/Intent;",
+ flags);
}
void CJNIIntent::addCategory(const std::string &category)
{
- call_method<jhstring>(m_object, "addCategory", "(Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(category));
+ call_method<jhstring>(m_object,
+ "addCategory", "(Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(category));
}
void CJNIIntent::setAction(const std::string &action)
{
- call_method<jhobject>(m_object, "setAction", "(Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(action));
+ call_method<jhobject>(m_object,
+ "setAction", "(Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(action));
}
void CJNIIntent::setClassName(const std::string &packageName, const std::string &className)
{
- call_method<jhobject>(m_object, "setClassName", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(packageName), jcast<jhstring>(className));
+ call_method<jhobject>(m_object,
+ "setClassName", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(packageName), jcast<jhstring>(className));
}
void CJNIIntent::setData(const std::string &uri)
{
- call_method<jhobject>(m_object, "setData", "(Landroid/net/Uri;)Landroid/content/Intent;", jcast<jhstring>(uri));
+ call_method<jhobject>(m_object,
+ "setData", "(Landroid/net/Uri;)Landroid/content/Intent;",
+ jcast<jhstring>(uri));
}
void CJNIIntent::setDataAndType(const CJNIURI &uri, const std::string &type)
{
- call_method<jhobject>(m_object, "setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", uri.get_raw(), jcast<jhstring>(type));
+ call_method<jhobject>(m_object,
+ "setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;",
+ uri.get_raw(), jcast<jhstring>(type));
}
void CJNIIntent::setFlags(int flags)
{
- call_method<jhobject>(m_object, "setFlags", "(I;)Landroid/content/Intent;", flags);
+ call_method<jhobject>(m_object,
+ "setFlags", "(I;)Landroid/content/Intent;",
+ flags);
}
void CJNIIntent::setPackage(const std::string &packageName)
{
- call_method<jhobject>(m_object, "setPackage", "(Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(packageName));
+ call_method<jhobject>(m_object,
+ "setPackage", "(Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(packageName));
}
void CJNIIntent::setType(const std::string &type)
{
- call_method<jhobject>(m_object, "setType", "(Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(type));
+ call_method<jhobject>(m_object,
+ "setType", "(Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(type));
}
CJNIURI CJNIIntent::getData() const
{
- return (CJNIURI)call_method<jhobject>(m_object, "getData","()Landroid/net/Uri;");
+ return (CJNIURI)call_method<jhobject>(m_object,
+ "getData","()Landroid/net/Uri;");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIURI;
{
public:
CJNIIntent(const std::string &action = "");
- ~CJNIIntent(){};
- CJNIIntent(const jni::jhobject &intent) : CJNIBase(intent){};
+ CJNIIntent(const jni::jhobject &intent) : CJNIBase(intent) {};
+ ~CJNIIntent() {};
std::string getAction();
std::string getDataString();
std::string getPackage();
std::string getType();
- int getIntExtra(const std::string &name, int defaultValue);
+ int getIntExtra(const std::string &name, int defaultValue);
bool hasExtra(const std::string &name);
bool hasCategory(const std::string &category);
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "IntentFilter.h"
#include "jutils/jutils-details.hpp"
CJNIIntentFilter::CJNIIntentFilter(const std::string &action) : CJNIBase("android/content/IntentFilter")
{
- m_object = new_object(GetClassName(), "<init>", "(Ljava/lang/String;)V", jcast<jhstring>(action));
+ m_object = new_object(GetClassName(),
+ "<init>", "(Ljava/lang/String;)V",
+ jcast<jhstring>(action));
}
void CJNIIntentFilter::addAction(std::string action)
{
- call_method<void>(m_object, "addAction", "(Ljava/lang/String;)V", jcast<jhstring>(action));
+ call_method<void>(m_object,
+ "addAction", "(Ljava/lang/String;)V",
+ jcast<jhstring>(action));
}
void CJNIIntentFilter::addDataScheme(std::string scheme)
{
- call_method<void>(m_object, "addDataScheme", "(Ljava/lang/String;)V", jcast<jhstring>(scheme));
+ call_method<void>(m_object,
+ "addDataScheme", "(Ljava/lang/String;)V",
+ jcast<jhstring>(scheme));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIIntentFilter : public CJNIBase
{
public:
CJNIIntentFilter();
+ CJNIIntentFilter(const jni::jhobject &object) : CJNIBase(object) {};
CJNIIntentFilter(const std::string &action);
+ ~CJNIIntentFilter() {};
+
void addDataScheme(std::string scheme);
void addAction(std::string action);
-
- ~CJNIIntentFilter(){};
- CJNIIntentFilter(const jni::jhobject &object) : CJNIBase(object){};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
+
using namespace jni;
+
CJNIBase::CJNIBase(std::string classname)
{
m_className = classname;
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "jutils/jutils.hpp"
class CJNIBase
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "List.h"
#include "jutils/jutils-details.hpp"
#include "ScanResult.h"
template <typename T>
T CJNIList<T>::get(int index)
{
- return (T)call_method<jhobject>(m_object, "get", "(I)Ljava/lang/Object;", index);
+ return (T)call_method<jhobject>(m_object,
+ "get", "(I)Ljava/lang/Object;",
+ index);
}
template <typename T>
int CJNIList<T>::size()
{
- return m_object.get() ? call_method<jint>(m_object, "size", "()I") : 0;
+ return m_object.get() ? call_method<jint>(m_object,
+ "size", "()I") : 0;
}
template class CJNIList<CJNIScanResult>;
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
template <typename T>
class CJNIList : public CJNIBase
{
public:
- ~CJNIList(){};
CJNIList(const jni::jhobject &object) : CJNIBase(object){};
- T get(int index);
+ ~CJNIList(){};
+
+ T get(int index);
int size();
+
private:
CJNIList();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "MediaStore.h"
#include "jutils/jutils-details.hpp"
std::string CJNIMediaStoreMediaColumns::DATE_ADDED;
std::string CJNIMediaStoreMediaColumns::DATE_MODIFIED;
std::string CJNIMediaStoreMediaColumns::MIME_TYPE;
+
void CJNIMediaStoreMediaColumns::PopulateStaticFields()
{
jhclass clazz = find_class("android/provider/MediaStore$MediaColumns");
- DATA = (jcast<std::string>(get_static_field<jhstring>(clazz, "DATA")));
- SIZE = (jcast<std::string>(get_static_field<jhstring>(clazz, "SIZE")));
- DISPLAY_NAME = (jcast<std::string>(get_static_field<jhstring>(clazz, "DISPLAY_NAME")));
- TITLE = (jcast<std::string>(get_static_field<jhstring>(clazz, "TITLE")));
- DATE_ADDED = (jcast<std::string>(get_static_field<jhstring>(clazz, "DATE_ADDED")));
+ DATA = (jcast<std::string>(get_static_field<jhstring>(clazz, "DATA")));
+ SIZE = (jcast<std::string>(get_static_field<jhstring>(clazz, "SIZE")));
+ DISPLAY_NAME = (jcast<std::string>(get_static_field<jhstring>(clazz, "DISPLAY_NAME")));
+ TITLE = (jcast<std::string>(get_static_field<jhstring>(clazz, "TITLE")));
+ DATE_ADDED = (jcast<std::string>(get_static_field<jhstring>(clazz, "DATE_ADDED")));
DATE_MODIFIED = (jcast<std::string>(get_static_field<jhstring>(clazz, "DATE_MODIFIED")));
- MIME_TYPE = (jcast<std::string>(get_static_field<jhstring>(clazz, "MIME_TYPE")));
+ MIME_TYPE = (jcast<std::string>(get_static_field<jhstring>(clazz, "MIME_TYPE")));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "BaseColumns.h"
+
class CJNIMediaStoreMediaColumns : public CJNIBaseColumns
{
public:
+ static void PopulateStaticFields();
+
static std::string DATA;
static std::string SIZE;
static std::string DISPLAY_NAME;
static std::string DATE_ADDED;
static std::string DATE_MODIFIED;
static std::string MIME_TYPE;
- static void PopulateStaticFields();
+
private:
CJNIMediaStoreMediaColumns();
};
class CJNIMediaStore : public CJNIBase
{
public:
- ~CJNIMediaStore(){};
- CJNIMediaStore(const jni::jhobject &object) : CJNIBase(object){};
+ CJNIMediaStore(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIMediaStore() {};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "NetworkInfo.h"
#include "jutils/jutils-details.hpp"
int CJNINetworkInfo::getType() const
{
- return call_method<jint>(m_object, "getType", "()I");
+ return call_method<jint>(m_object,
+ "getType", "()I");
}
int CJNINetworkInfo::getSubtype() const
{
- return call_method<jint>(m_object, "getSubtype", "()I");
+ return call_method<jint>(m_object,
+ "getSubtype", "()I");
}
std::string CJNINetworkInfo::getTypeName() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getTypeName", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getTypeName", "()Ljava/lang/String;"));
}
std::string CJNINetworkInfo::getSubtypeName() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getTypeName", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getTypeName", "()Ljava/lang/String;"));
}
bool CJNINetworkInfo::isConnectedOrConnecting() const
{
- return call_method<jboolean>(m_object, "isConnectedOrConnecting", "()Z");
+ return call_method<jboolean>(m_object,
+ "isConnectedOrConnecting", "()Z");
}
bool CJNINetworkInfo::isConnected() const
{
- return call_method<jboolean>(m_object, "isConnected", "()Z");
+ return call_method<jboolean>(m_object,
+ "isConnected", "()Z");
}
bool CJNINetworkInfo::isAvailable() const
{
- return call_method<jboolean>(m_object, "isAvailable", "()Z");
+ return call_method<jboolean>(m_object,
+ "isAvailable", "()Z");
}
bool CJNINetworkInfo::isFailover() const
{
- return call_method<jboolean>(m_object, "isFailover", "()Z");
+ return call_method<jboolean>(m_object,
+ "isFailover", "()Z");
}
bool CJNINetworkInfo::isRoaming() const
{
- return call_method<jboolean>(m_object, "isRoaming", "()Z");
+ return call_method<jboolean>(m_object,
+ "isRoaming", "()Z");
}
CJNINetworkInfoState CJNINetworkInfo::getState() const
{
- return (CJNINetworkInfoState)call_method<jhobject>(m_object, "getState", "()Landroid/net/NetworkInfo$State;");
+ return call_method<jhobject>(m_object,
+ "getState", "()Landroid/net/NetworkInfo$State;");
}
CJNINetworkInfoDetailedState CJNINetworkInfo::getDetailedState() const
{
- return (CJNINetworkInfoDetailedState)call_method<jhobject>(m_object, "getDetailedState", "()Landroid/net/NetworkInfo$DetailedState;");
+ return call_method<jhobject>(m_object,
+ "getDetailedState", "()Landroid/net/NetworkInfo$DetailedState;");
}
std::string CJNINetworkInfo::getReason() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getReason", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getReason", "()Ljava/lang/String;"));
}
std::string CJNINetworkInfo::getExtraInfo() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getExtraInfo", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getExtraInfo", "()Ljava/lang/String;"));
}
std::string CJNINetworkInfo::toString() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
int CJNINetworkInfo::describeContents() const
{
- return call_method<jint>(m_object, "describeContents", "()I");
+ return call_method<jint>(m_object,
+ "describeContents", "()I");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "Enum.h"
class CJNINetworkInfoState : public CJNIEnum
{
public:
- ~CJNINetworkInfoState(){};
- CJNINetworkInfoState(const jni::jhobject &object) : CJNIEnum(object){};
+ CJNINetworkInfoState(const jni::jhobject &object) : CJNIEnum(object) {};
+ ~CJNINetworkInfoState() {};
+
private:
CJNINetworkInfoState();
};
class CJNINetworkInfoDetailedState : public CJNIEnum
{
public:
- ~CJNINetworkInfoDetailedState(){};
- CJNINetworkInfoDetailedState(const jni::jhobject &object) : CJNIEnum(object){};
+ CJNINetworkInfoDetailedState(const jni::jhobject &object) : CJNIEnum(object) {};
+ ~CJNINetworkInfoDetailedState() {};
+
private:
CJNINetworkInfoDetailedState();
};
class CJNINetworkInfo : public CJNIBase
{
public:
+ CJNINetworkInfo();
CJNINetworkInfo(const jni::jhobject &object) : CJNIBase(object){};
~CJNINetworkInfo(){};
- int getType() const;
- int getSubtype() const;
+
+ int getType() const;
+ int getSubtype() const;
std::string getTypeName() const;
std::string getSubtypeName() const;
- bool isConnectedOrConnecting() const;
- bool isConnected() const;
- bool isAvailable() const;
- bool isFailover() const;
- bool isRoaming() const;
+ bool isConnectedOrConnecting() const;
+ bool isConnected() const;
+ bool isAvailable() const;
+ bool isFailover() const;
+ bool isRoaming() const;
CJNINetworkInfoState getState() const;
CJNINetworkInfoDetailedState getDetailedState() const;
- std::string getReason() const;
+ std::string getReason() const;
std::string getExtraInfo() const;
- std::string toString() const;
- int describeContents() const;
- CJNINetworkInfo();
-private:
+ std::string toString() const;
+ int describeContents() const;
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "PackageManager.h"
#include "Intent.h"
#include "Drawable.h"
void CJNIPackageManager::PopulateStaticFields()
{
- jhclass clazz = find_class("android/content/pm/PackageManager");
+ jhclass clazz = find_class("android/content/pm/PackageManager");
GET_ACTIVITIES = (get_static_field<int>(clazz, "GET_ACTIVITIES"));
}
CJNIIntent CJNIPackageManager::getLaunchIntentForPackage(const std::string &package)
{
- return (CJNIIntent)call_method<jhobject>(m_object, "getLaunchIntentForPackage", "(Ljava/lang/String;)Landroid/content/Intent;", jcast<jhstring>(package));
+ return call_method<jhobject>(m_object,
+ "getLaunchIntentForPackage", "(Ljava/lang/String;)Landroid/content/Intent;",
+ jcast<jhstring>(package));
}
CJNIDrawable CJNIPackageManager::getApplicationIcon(const std::string &package)
{
- return (CJNIDrawable)call_method<jhobject>(m_object, "getApplicationIcon", "(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;", jcast<jhstring>(package));
+ return call_method<jhobject>(m_object,
+ "getApplicationIcon", "(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;",
+ jcast<jhstring>(package));
}
CJNICharSequence CJNIPackageManager::getApplicationLabel(const CJNIApplicationInfo &info)
{
- return (CJNICharSequence)call_method<jhobject>(m_object, "getApplicationLabel", "(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;", info.get_raw());
+ return call_method<jhobject>(m_object,
+ "getApplicationLabel", "(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;",
+ info.get_raw());
}
CJNIList<CJNIApplicationInfo> CJNIPackageManager::getInstalledApplications(int flags)
{
- return (CJNIList<CJNIApplicationInfo>)call_method<jhobject>(m_object, "getInstalledApplications", "(I)Ljava/util/List;", flags);
+ return call_method<jhobject>(m_object,
+ "getInstalledApplications", "(I)Ljava/util/List;",
+ flags);
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "List.h"
class CJNIDrawable;
class CJNIApplicationInfo;
class CJNICharSequence;
+
class CJNIPackageManager : public CJNIBase
{
public:
CJNIPackageManager(const jni::jhobject &object) : CJNIBase(object) {};
- ~CJNIPackageManager(){};
+ ~CJNIPackageManager() {};
- CJNIIntent getLaunchIntentForPackage(const std::string &package);
- CJNIDrawable getApplicationIcon(const std::string &package);
+ CJNIIntent getLaunchIntentForPackage(const std::string &package);
+ CJNIDrawable getApplicationIcon(const std::string &package);
CJNIList<CJNIApplicationInfo> getInstalledApplications(int flags);
- CJNICharSequence getApplicationLabel(const CJNIApplicationInfo &info);
+ CJNICharSequence getApplicationLabel(const CJNIApplicationInfo &info);
+
+ static void PopulateStaticFields();
+ static int GET_ACTIVITIES;
- static void PopulateStaticFields();
- static int GET_ACTIVITIES;
private:
CJNIPackageManager();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "PowerManager.h"
-#include "jutils/jutils-details.hpp"
#include "WakeLock.h"
+#include "jutils/jutils-details.hpp"
using namespace jni;
void CJNIPowerManager::PopulateStaticFields()
{
- jhclass clazz = find_class("android/os/PowerManager");
+ jhclass clazz = find_class("android/os/PowerManager");
FULL_WAKE_LOCK = (get_static_field<int>(clazz, "FULL_WAKE_LOCK"));
}
CJNIWakeLock CJNIPowerManager::newWakeLock(const std::string &name)
{
- return (CJNIWakeLock)call_method<jhobject>(m_object, "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", \
- FULL_WAKE_LOCK, jcast<jhstring>(name));
+ return call_method<jhobject>(m_object,
+ "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;",
+ FULL_WAKE_LOCK, jcast<jhstring>(name));
}
void CJNIPowerManager::goToSleep(int64_t timestamp)
{
- call_method<void>(m_object, "goToSleep", "(J)V", (jlong)timestamp);
+ call_method<void>(m_object,
+ "goToSleep", "(J)V",
+ (jlong)timestamp);
}
void CJNIPowerManager::reboot(const std::string &reason)
{
- call_method<void>(m_object, "reboot", "(Ljava/lang/String;)V", jcast<jhstring>(reason));
+ call_method<void>(m_object,
+ "reboot", "(Ljava/lang/String;)V",
+ jcast<jhstring>(reason));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIWakeLock;
+
class CJNIPowerManager : public CJNIBase
{
public:
- CJNIWakeLock newWakeLock(const std::string &name);
- void reboot(const std::string &reason);
- void goToSleep(int64_t timestamp);
+ CJNIPowerManager(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIPowerManager() {};
- static void PopulateStaticFields();
- CJNIPowerManager(const jni::jhobject &object) : CJNIBase(object){};
- ~CJNIPowerManager(){};
+ CJNIWakeLock newWakeLock(const std::string &name);
+ void reboot(const std::string &reason);
+ void goToSleep(int64_t timestamp);
+
+ static void PopulateStaticFields();
private:
CJNIPowerManager();
+
static int FULL_WAKE_LOCK;
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "ScanResult.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
CJNIScanResult::CJNIScanResult(const jhobject &object) : CJNIBase(object)
- ,SSID(jcast<std::string>(get_field<jhstring>(m_object, "SSID")))
- ,BSSID(jcast<std::string>(get_field<jhstring>(m_object, "BSSID")))
+ ,SSID( jcast<std::string>(get_field<jhstring>(m_object, "SSID")))
+ ,BSSID( jcast<std::string>(get_field<jhstring>(m_object, "BSSID")))
,capabilities(jcast<std::string>(get_field<jhstring>(m_object, "capabilities")))
- ,level(get_field<int>(m_object, "level"))
- ,frequency(get_field<int>(m_object, "frequency"))
+ ,level( get_field<int>(m_object, "level"))
+ ,frequency( get_field<int>(m_object, "frequency"))
{
}
std::string CJNIScanResult::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
int CJNIScanResult::describeContents()
{
- return call_method<jint>(m_object, "describeContents", "()I");
+ return call_method<jint>(m_object,
+ "describeContents", "()I");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIScanResult : public CJNIBase
{
public:
CJNIScanResult(const jni::jhobject &object);
+ ~CJNIScanResult(){};
+
std::string SSID;
std::string BSSID;
std::string capabilities;
- int level;
- int frequency;
+ int level;
+ int frequency;
std::string toString();
- int describeContents();
+ int describeContents();
- ~CJNIScanResult(){};
private:
CJNIScanResult();
};
+
typedef std::vector<CJNIScanResult> CJNIScanResults;
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "StatFs.h"
#include "jutils/jutils-details.hpp"
CJNIStatFs::CJNIStatFs(const std::string &path) : CJNIBase("android/os/StatFs")
{
- m_object = new_object(GetClassName(), "<init>", "(Ljava/lang/String;)V", jcast<jhstring>(path));
+ m_object = new_object(GetClassName(), "<init>",
+ "(Ljava/lang/String;)V",
+ jcast<jhstring>(path));
m_object.setGlobal();
}
void CJNIStatFs::restat(const std::string &path)
{
- call_method<void>(m_object, "restat", "(Ljava/lang/String;)V", jcast<jhstring>(path));
+ call_method<void>(m_object,
+ "restat", "(Ljava/lang/String;)V",
+ jcast<jhstring>(path));
}
int CJNIStatFs::getBlockSize()
{
- return call_method<jint>(m_object, "getBlockSize", "()I");
+ return call_method<jint>(m_object,
+ "getBlockSize", "()I");
}
int CJNIStatFs::getBlockCount()
{
- return call_method<jint>(m_object, "getBlockCount", "()I");
+ return call_method<jint>(m_object,
+ "getBlockCount", "()I");
}
int CJNIStatFs::getFreeBlocks()
{
- return call_method<jint>(m_object, "getFreeBlocks", "()I");
+ return call_method<jint>(m_object,
+ "getFreeBlocks", "()I");
}
int CJNIStatFs::getAvailableBlocks()
{
- return call_method<jint>(m_object, "getAvailableBlocks", "()I");
+ return call_method<jint>(m_object,
+ "getAvailableBlocks", "()I");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIStatFs : public CJNIBase
{
public:
CJNIStatFs(const std::string &path);
- CJNIStatFs(const jni::jhobject &object) : CJNIBase(object){};
- ~CJNIStatFs(){};
- void restat(const std::string &path);
- int getBlockSize();
- int getBlockCount();
- int getFreeBlocks();
- int getAvailableBlocks();
+ CJNIStatFs(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIStatFs() {};
+
+ void restat(const std::string &path);
+ int getBlockSize();
+ int getBlockCount();
+ int getFreeBlocks();
+ int getAvailableBlocks();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "System.h"
#include "jutils/jutils-details.hpp"
std::string CJNISystem::getProperty(const std::string &property)
{
- return jcast<std::string>(call_static_method<jhstring>("java/lang/System", "getProperty", "(Ljava/lang/String;)Ljava/lang/String;", jcast<jhstring>(property)));
+ return jcast<std::string>(call_static_method<jhstring>("java/lang/System",
+ "getProperty", "(Ljava/lang/String;)Ljava/lang/String;",
+ jcast<jhstring>(property)));
}
std::string CJNISystem::getProperty(const std::string &property, const std::string &defaultValue)
{
- return jcast<std::string>(call_static_method<jhstring>("java/lang/System", "getProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", jcast<jhstring>(property), jcast<jhstring>(defaultValue)));
+ return jcast<std::string>(call_static_method<jhstring>("java/lang/System",
+ "getProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+ jcast<jhstring>(property), jcast<jhstring>(defaultValue)));
}
std::string CJNISystem::setProperty(const std::string &property, const std::string &defaultValue)
{
- return jcast<std::string>(call_static_method<jhstring>("java/lang/System", "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", jcast<jhstring>(property), jcast<jhstring>(defaultValue)));
+ return jcast<std::string>(call_static_method<jhstring>("java/lang/System",
+ "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+ jcast<jhstring>(property), jcast<jhstring>(defaultValue)));
}
std::string CJNISystem::clearProperty(const std::string &property)
{
- return jcast<std::string>(call_static_method<jhstring>("java/lang/System", "clearProperty", "(Ljava/lang/String;)Ljava/lang/String;", jcast<jhstring>(property)));
+ return jcast<std::string>(call_static_method<jhstring>("java/lang/System",
+ "clearProperty", "(Ljava/lang/String;)Ljava/lang/String;",
+ jcast<jhstring>(property)));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNISystem
{
public:
- static std::string getProperty(const std::string &property);
- static std::string getProperty(const std::string &property, const std::string &defaultValue);
- static std::string setProperty(const std::string &property, const std::string &defaultValue);
+ static std::string getProperty( const std::string &property);
+ static std::string getProperty( const std::string &property, const std::string &defaultValue);
+ static std::string setProperty( const std::string &property, const std::string &defaultValue);
static std::string clearProperty(const std::string &property);
+
private:
CJNISystem();
- ~CJNISystem(){};
-
+ ~CJNISystem() {};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "SystemClock.h"
#include "jutils/jutils-details.hpp"
int64_t CJNISystemClock::uptimeMillis()
{
- return call_static_method<jlong>("android/os/SystemClock", "uptimeMillis", "()J");
+ return call_static_method<jlong>("android/os/SystemClock",
+ "uptimeMillis", "()J");
}
* <http://www.gnu.org/licenses/>.
*
*/
-// This class contains only static methods, so no need to inherit from JNIBase.
+
#include <stdint.h>
+
+// This class contains only static methods, so no need to inherit from JNIBase.
class CJNISystemClock
{
public:
static int64_t uptimeMillis();
+
private:
- CJNISystemClock(){};
- ~CJNISystemClock(){};
+ CJNISystemClock() {};
+ ~CJNISystemClock() {};
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "URI.h"
#include "jutils/jutils-details.hpp"
CJNIURI CJNIURI::parse(std::string uriString)
{
- return (CJNIURI)call_static_method<jhobject>("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", jcast<jhstring>(uriString));
+ return call_static_method<jhobject>("android/net/Uri",
+ "parse", "(Ljava/lang/String;)Landroid/net/Uri;",
+ jcast<jhstring>(uriString));
}
std::string CJNIURI::getScheme() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getScheme", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getScheme", "()Ljava/lang/String;"));
}
std::string CJNIURI::toString() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
std::string CJNIURI::getLastPathSegment() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getLastPathSegment", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getLastPathSegment", "()Ljava/lang/String;"));
}
std::string CJNIURI::getPath() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getPath", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getPath", "()Ljava/lang/String;"));
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIURI : public CJNIBase
{
- public:
- CJNIURI(const jni::jhobject &uri) : CJNIBase(uri){};
+public:
+ CJNIURI(const jni::jhobject &uri) : CJNIBase(uri) {};
+ ~CJNIURI() {};
+
std::string getScheme() const;
- std::string toString() const;
+ std::string toString() const;
std::string getLastPathSegment() const;
- std::string getPath() const;
+ std::string getPath() const;
static CJNIURI parse(std::string uriString);
- ~CJNIURI(){};
+
private:
CJNIURI();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "WakeLock.h"
#include "jutils/jutils-details.hpp"
void CJNIWakeLock::acquire()
{
- call_method<void>(m_object, "acquire", "()V");
+ call_method<void>(m_object,
+ "acquire", "()V");
}
void CJNIWakeLock::release()
{
- call_method<void>(m_object, "release", "()V");
+ call_method<void>(m_object,
+ "release", "()V");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
class CJNIWakeLock : public CJNIBase
{
public:
- CJNIWakeLock(const jni::jhobject &wakelock) : CJNIBase(wakelock){};
- ~CJNIWakeLock(){};
+ CJNIWakeLock(const jni::jhobject &wakelock) : CJNIBase(wakelock) {};
+ ~CJNIWakeLock() {};
+
void acquire();
void release();
+
protected:
CJNIWakeLock();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "WifiConfiguration.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
CJNIWifiConfiguration::CJNIWifiConfiguration(const jhobject &object) : CJNIBase(object)
- ,networkId(get_field<jint>(m_object, "networkId"))
- ,status(get_field<jint>(m_object, "status"))
- ,SSID(jcast<std::string>(get_field<jhstring>(m_object, "SSID")))
- ,BSSID(jcast<std::string>(get_field<jhstring>(m_object, "BSSID")))
- ,preSharedKey(jcast<std::string>(get_field<jhstring>(m_object, "preSharedKey")))
- ,wepTxKeyIndex(get_field<jint>(m_object, "wepTxKeyIndex"))
- ,priority(get_field<jint>(m_object, "priority"))
- ,hiddenSSID(get_field<jboolean>(m_object, "hiddenSSID"))
- ,allowedKeyManagement(get_field<jhobject>(m_object, "allowedKeyManagement", "Ljava/util/BitSet;"))
- ,allowedProtocols(get_field<jhobject>(m_object, "allowedProtocols", "Ljava/util/BitSet;"))
+ ,networkId( get_field<jint>(m_object, "networkId"))
+ ,status( get_field<jint>(m_object, "status"))
+ ,SSID( jcast<std::string>(get_field<jhstring>(m_object, "SSID")))
+ ,BSSID( jcast<std::string>(get_field<jhstring>(m_object, "BSSID")))
+ ,preSharedKey( jcast<std::string>(get_field<jhstring>(m_object, "preSharedKey")))
+ ,wepTxKeyIndex( get_field<jint>(m_object, "wepTxKeyIndex"))
+ ,priority( get_field<jint>(m_object, "priority"))
+ ,hiddenSSID( get_field<jboolean>(m_object, "hiddenSSID"))
+ ,allowedKeyManagement( get_field<jhobject>(m_object, "allowedKeyManagement", "Ljava/util/BitSet;"))
+ ,allowedProtocols( get_field<jhobject>(m_object, "allowedProtocols", "Ljava/util/BitSet;"))
,allowedPairwiseCiphers(get_field<jhobject>(m_object, "allowedPairwiseCiphers", "Ljava/util/BitSet;"))
- ,allowedGroupCiphers(get_field<jhobject>(m_object, "allowedGroupCiphers", "Ljava/util/BitSet;"))
+ ,allowedGroupCiphers( get_field<jhobject>(m_object, "allowedGroupCiphers", "Ljava/util/BitSet;"))
{
}
std::string CJNIWifiConfiguration::toString()
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
int CJNIWifiConfiguration::describeContents()
{
- return call_method<jint>(m_object, "describeContents", "()I");
+ return call_method<jint>(m_object,
+ "describeContents", "()I");
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "BitSet.h"
+
class CJNIWifiConfiguration : public CJNIBase
{
public:
CJNIWifiConfiguration(const jni::jhobject &object);
- ~CJNIWifiConfiguration(){};
+ ~CJNIWifiConfiguration() {};
- int networkId;
- int status;
+ int networkId;
+ int status;
std::string SSID;
std::string BSSID;
std::string preSharedKey;
// std::string[] wepKeys;
- int wepTxKeyIndex;
- int priority;
- bool hiddenSSID;
- CJNIBitSet allowedKeyManagement;
- CJNIBitSet allowedProtocols;
- CJNIBitSet allowedAuthAlgorithms;
- CJNIBitSet allowedPairwiseCiphers;
- CJNIBitSet allowedGroupCiphers;
+ int wepTxKeyIndex;
+ int priority;
+ bool hiddenSSID;
+ CJNIBitSet allowedKeyManagement;
+ CJNIBitSet allowedProtocols;
+ CJNIBitSet allowedAuthAlgorithms;
+ CJNIBitSet allowedPairwiseCiphers;
+ CJNIBitSet allowedGroupCiphers;
std::string toString();
- int describeContents();
+ int describeContents();
private:
CJNIWifiConfiguration();
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "WifiInfo.h"
#include "jutils/jutils-details.hpp"
std::string CJNIWifiInfo::getSSID() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getSSID", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getSSID", "()Ljava/lang/String;"));
}
std::string CJNIWifiInfo::getBSSID() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getBSSID", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getBSSID", "()Ljava/lang/String;"));
}
int CJNIWifiInfo::getRssi() const
{
- return call_method<jint>(m_object, "getRssi", "()I");
+ return call_method<jint>(m_object,
+ "getRssi", "()I");
}
int CJNIWifiInfo::getLinkSpeed() const
{
- return call_method<jint>(m_object, "getLinkSpeed", "()I");
+ return call_method<jint>(m_object,
+ "getLinkSpeed", "()I");
}
std::string CJNIWifiInfo::getMacAddress() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "getMacAddress", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "getMacAddress", "()Ljava/lang/String;"));
}
int CJNIWifiInfo::getNetworkId() const
{
- return call_method<jint>(m_object, "getNetworkId", "()I");
+ return call_method<jint>(m_object,
+ "getNetworkId", "()I");
}
int CJNIWifiInfo::getIpAddress() const
{
- return call_method<jint>(m_object, "getIpAddress" , "()I");
+ return call_method<jint>(m_object,
+ "getIpAddress" , "()I");
}
bool CJNIWifiInfo::getHiddenSSID() const
{
- return call_method<jboolean>(m_object, "getHiddenSSID" , "()Z");
+ return call_method<jboolean>(m_object,
+ "getHiddenSSID" , "()Z");
}
std::string CJNIWifiInfo::toString() const
{
- return jcast<std::string>(call_method<jhstring>(m_object, "toString", "()Ljava/lang/String;"));
+ return jcast<std::string>(call_method<jhstring>(m_object,
+ "toString", "()Ljava/lang/String;"));
}
int CJNIWifiInfo::describeContents() const
{
- return call_method<jint>(m_object, "describeContents" , "()I");
+ return call_method<jint>(m_object,
+ "describeContents" , "()I");
}
CJNISupplicantState CJNIWifiInfo::getSupplicantState() const
{
- return call_method<jhobject>(m_object, "getSupplicantState", "()Landroid/net/wifi/SupplicantState;");
+ return call_method<jhobject>(m_object,
+ "getSupplicantState", "()Landroid/net/wifi/SupplicantState;");
}
CJNINetworkInfoDetailedState CJNIWifiInfo::getDetailedStateOf(const CJNISupplicantState &suppState)
{
- return call_static_method<jhobject>("android/net/wifi/WifiInfo", "getDetailedStateOf", "(Landroid/net/wifi/SupplicantState;)Landroid/net/NetworkInfo$DetailedState;", suppState.get_raw());
+ return call_static_method<jhobject>("android/net/wifi/WifiInfo",
+ "getDetailedStateOf", "(Landroid/net/wifi/SupplicantState;)Landroid/net/NetworkInfo$DetailedState;",
+ suppState.get_raw());
}
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "Enum.h"
#include "NetworkInfo.h"
class CJNISupplicantState : public CJNIEnum
{
public:
- ~CJNISupplicantState(){};
CJNISupplicantState(const jni::jhobject &object) : CJNIEnum(object){};
+ ~CJNISupplicantState(){};
+
private:
CJNISupplicantState();
};
public:
CJNIWifiInfo(const jni::jhobject &object) : CJNIBase(object){};
~CJNIWifiInfo(){};
- std::string getSSID() const;
+
+ std::string getSSID() const;
std::string getBSSID() const;
- int getRssi() const;
- int getLinkSpeed() const;
+ int getRssi() const;
+ int getLinkSpeed() const;
std::string getMacAddress() const;
- int getNetworkId() const;
- int getIpAddress() const;
- bool getHiddenSSID() const;
+ int getNetworkId() const;
+ int getIpAddress() const;
+ bool getHiddenSSID() const;
std::string toString() const;
- int describeContents() const;
+ int describeContents() const;
CJNISupplicantState getSupplicantState() const;
static CJNINetworkInfoDetailedState getDetailedStateOf(const CJNISupplicantState &suppState);
+
private:
CJNIWifiInfo();
};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "WifiManager.h"
#include "DhcpInfo.h"
#include "List.h"
CJNIList<CJNIWifiConfiguration> CJNIWifiManager::getConfiguredNetworks()
{
- return (CJNIList<CJNIWifiConfiguration>)call_method<jhobject>(m_object, "getConfiguredNetworks" , "()Ljava/util/List;");
+ return call_method<jhobject>(m_object,
+ "getConfiguredNetworks" , "()Ljava/util/List;");
}
CJNIList<CJNIScanResult> CJNIWifiManager::getScanResults()
{
- return (CJNIList<CJNIScanResult>)call_method<jhobject>(m_object, "getScanResults" , "()Ljava/util/List;");
+ return call_method<jhobject>(m_object,
+ "getScanResults" , "()Ljava/util/List;");
}
bool CJNIWifiManager::removeNetwork(int netId)
{
- return call_method<jboolean>(m_object, "removeNetwork", "(I)Z", netId);
+ return call_method<jboolean>(m_object,
+ "removeNetwork", "(I)Z", netId);
}
bool CJNIWifiManager::enableNetwork(int netID, bool disableOthers)
{
- return call_method<jboolean>(m_object, "enableNetwork", "(IZ)Z", netID, disableOthers);
+ return call_method<jboolean>(m_object,
+ "enableNetwork", "(IZ)Z", netID, disableOthers);
}
bool CJNIWifiManager::disableNetwork(int netID)
{
- return call_method<jboolean>(m_object, "disableNetwork", "(I)Z", netID);
+ return call_method<jboolean>(m_object,
+ "disableNetwork", "(I)Z", netID);
}
bool CJNIWifiManager::disconnect()
{
- return call_method<jboolean>(m_object, "disconnect", "()Z");
+ return call_method<jboolean>(m_object,
+ "disconnect", "()Z");
}
bool CJNIWifiManager::reconnect()
{
- return call_method<jboolean>(m_object, "reconnect", "()Z");
+ return call_method<jboolean>(m_object,
+ "reconnect", "()Z");
}
bool CJNIWifiManager::reassociate()
{
- return call_method<jboolean>(m_object, "rassociate", "()Z");
+ return call_method<jboolean>(m_object,
+ "rassociate", "()Z");
}
bool CJNIWifiManager::pingSupplicant()
{
- return call_method<jboolean>(m_object, "pingSupplicant", "()Z");
+ return call_method<jboolean>(m_object,
+ "pingSupplicant", "()Z");
}
bool CJNIWifiManager::startScan()
{
- return call_method<jboolean>(m_object, "startScan", "()Z");
+ return call_method<jboolean>(m_object,
+ "startScan", "()Z");
}
CJNIWifiInfo CJNIWifiManager::getConnectionInfo()
{
- return (CJNIWifiInfo)call_method<jhobject>(m_object, "getConnectionInfo", "()Landroid/net/wifi/WifiInfo;");
+ return call_method<jhobject>(m_object,
+ "getConnectionInfo", "()Landroid/net/wifi/WifiInfo;");
}
bool CJNIWifiManager::saveConfiguration()
{
- return call_method<jboolean>(m_object, "saveConfiguration", "()Z");
+ return call_method<jboolean>(m_object,
+ "saveConfiguration", "()Z");
}
CJNIDhcpInfo CJNIWifiManager::getDhcpInfo()
{
- return call_method<jhobject>(m_object, "getDhcpInfo", "()Landroid/net/DhcpInfo;");
+ return call_method<jhobject>(m_object,
+ "getDhcpInfo", "()Landroid/net/DhcpInfo;");
}
bool CJNIWifiManager::setWifiEnabled(bool enabled)
{
- return call_method<jboolean>(m_object, "setWifiEnabled", "(Z)Z", enabled);
+ return call_method<jboolean>(m_object,
+ "setWifiEnabled", "(Z)Z", enabled);
}
int CJNIWifiManager::getWifiState()
{
- return call_method<jint>(m_object, "getWifiState", "()I");
+ return call_method<jint>(m_object,
+ "getWifiState", "()I");
}
bool CJNIWifiManager::isWifiEnabled()
{
- return call_method<jboolean>(m_object, "isWifiEnabled", "()Z");
+ return call_method<jboolean>(m_object,
+ "isWifiEnabled", "()Z");
}
int CJNIWifiManager::calculateSignalLevel(int rssi, int numLevels)
{
- return call_static_method<jint>("android/net/wifi/WifiManager", "calculateSignalLevel", "(II)I", rssi, numLevels);
+ return call_static_method<jint>("android/net/wifi/WifiManager",
+ "calculateSignalLevel", "(II)I", rssi, numLevels);
}
int CJNIWifiManager::compareSignalLevel(int rssiA, int rssiB)
{
- return call_static_method<jint>("android/net/wifi/WifiManager", "compareSignalLevel", "(II)I", rssiA, rssiB);
+ return call_static_method<jint>("android/net/wifi/WifiManager",
+ "compareSignalLevel", "(II)I", rssiA, rssiB);
}
CJNIWifiManagerMulticastLock CJNIWifiManager::createMulticastLock(const std::string &tag)
* <http://www.gnu.org/licenses/>.
*
*/
+
#include "JNIBase.h"
#include "List.h"
+
class CJNIDhcpInfo;
class CJNIWifiInfo;
class CJNIScanResult;
class CJNIWifiConfiguration;
class CJNIWifiManagerMulticastLock;
+
class CJNIWifiManager : public CJNIBase
{
friend class CJNIContext;
public:
CJNIWifiManager(const jni::jhobject &object) : CJNIBase(object){};
+
CJNIList<CJNIWifiConfiguration> getConfiguredNetworks();
bool removeNetwork(int);
bool enableNetwork(int, bool);
bool saveConfiguration();
CJNIDhcpInfo getDhcpInfo();
bool setWifiEnabled(bool);
- int getWifiState();
+ int getWifiState();
bool isWifiEnabled();
static int calculateSignalLevel(int, int);
static int compareSignalLevel(int, int);
CJNIWifiManagerMulticastLock createMulticastLock(const std::string &tag);
+
private:
CJNIWifiManager();
};
#define DBG(fmt, ...)
#include <string>
#include "jutils/jutils-details.hpp"
+
namespace jni
{
+
namespace details
{
+
std::string jcast_helper<std::string, jstring>::cast(jstring const &v)
{
JNIEnv *env = xbmc_jnienv();
AVCodec *codec;
codec = m_dllAvCodec.avcodec_find_encoder(
- strcmp(fmt->name, "ogg") == 0 ? CODEC_ID_VORBIS : fmt->audio_codec
+ strcmp(fmt->name, "ogg") == 0 ? AV_CODEC_ID_VORBIS : fmt->audio_codec
);
if (!codec)
if (dts && (!ac3 || g_advancedSettings.m_audioTranscodeTo.Equals("dts")))
{
m_CodecName = "DTS";
- m_CodecID = CODEC_ID_DTS;
+ m_CodecID = AV_CODEC_ID_DTS;
m_PackFunc = &CAEPackIEC61937::PackDTS_1024;
m_BitRate = DTS_ENCODE_BITRATE;
codec = m_dllAvCodec.avcodec_find_encoder(m_CodecID);
if (!codec && ac3)
{
m_CodecName = "AC3";
- m_CodecID = CODEC_ID_AC3;
+ m_CodecID = AV_CODEC_ID_AC3;
m_PackFunc = &CAEPackIEC61937::PackAC3;
m_BitRate = AC3_ENCODE_BITRATE;
codec = m_dllAvCodec.avcodec_find_encoder(m_CodecID);
return m_BitRate;
}
-CodecID CAEEncoderFFmpeg::GetCodecID()
+AVCodecID CAEEncoderFFmpeg::GetCodecID()
{
return m_CodecID;
}
virtual void Reset();
virtual unsigned int GetBitRate ();
- virtual CodecID GetCodecID ();
+ virtual AVCodecID GetCodecID ();
virtual unsigned int GetFrames ();
virtual int Encode (float *data, unsigned int frames);
DllSwResample m_dllSwResample;
std::string m_CodecName;
- CodecID m_CodecID;
+ AVCodecID m_CodecID;
unsigned int m_BitRate;
CAEPackIEC61937::PackFunc m_PackFunc;
virtual unsigned int GetBitRate() = 0;
/**
- * Returns the CodecID of the encoder
+ * Returns the AVCodecID of the encoder
* @return the ffmpeg codec id
*/
- virtual CodecID GetCodecID() = 0;
+ virtual AVCodecID GetCodecID() = 0;
/**
* Return the number of frames needed to encode
/* TODO: handle other subtitle codec types
// subtitle codecs
- CODEC_ID_DVD_SUBTITLE= 0x17000,
- CODEC_ID_DVB_SUBTITLE,
- CODEC_ID_TEXT, ///< raw UTF-8 text
- CODEC_ID_XSUB,
- CODEC_ID_SSA,
- CODEC_ID_MOV_TEXT,
- CODEC_ID_HDMV_PGS_SUBTITLE,
- CODEC_ID_DVB_TELETEXT,
- CODEC_ID_SRT,
- CODEC_ID_MICRODVD,
+ AV_CODEC_ID_DVD_SUBTITLE= 0x17000,
+ AV_CODEC_ID_DVB_SUBTITLE,
+ AV_CODEC_ID_TEXT, ///< raw UTF-8 text
+ AV_CODEC_ID_XSUB,
+ AV_CODEC_ID_SSA,
+ AV_CODEC_ID_MOV_TEXT,
+ AV_CODEC_ID_HDMV_PGS_SUBTITLE,
+ AV_CODEC_ID_DVB_TELETEXT,
+ AV_CODEC_ID_SRT,
+ AV_CODEC_ID_MICRODVD,
*/
switch(sub_type)
{
"sub_type(0x%x), size(%d), bgntime(%lld), endtime(%lld), string(%s)",
sub_type, sub_size-20, subtitle->bgntime, subtitle->endtime, &sub_buffer[20]);
break;
- case CODEC_ID_TEXT:
+ case AV_CODEC_ID_TEXT:
subtitle->bgntime = sub_pts/ 90;
subtitle->endtime = subtitle->bgntime + 4000;
subtitle->string = &sub_buffer[20];
break;
- case CODEC_ID_SSA:
+ case AV_CODEC_ID_SSA:
if (strncmp((const char*)&sub_buffer[20], "Dialogue:", 9) == 0)
{
int vars_found, hour1, min1, sec1, hunsec1, hour2, min2, sec2, hunsec2, nothing;
free(m_pBuffer);
}
-bool CDVDAudio::Create(const DVDAudioFrame &audioframe, CodecID codec, bool needresampler)
+bool CDVDAudio::Create(const DVDAudioFrame &audioframe, AVCodecID codec, bool needresampler)
{
CLog::Log(LOGNOTICE,
"Creating audio stream (codec id: %i, channels: %i, sample rate: %i, %s)",
float GetCurrentAttenuation();
void Pause();
void Resume();
- bool Create(const DVDAudioFrame &audioframe, CodecID codec, bool needresampler);
+ bool Create(const DVDAudioFrame &audioframe, AVCodecID codec, bool needresampler);
bool IsValidFormat(const DVDAudioFrame &audioframe);
void Destroy();
unsigned int AddPackets(const DVDAudioFrame &audioframe);
{
m_iBufferSize1 = 0;
m_iBufferSize2 = 0;
- m_pBuffer2 = (uint8_t*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16);
- memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
+ m_iBufferTotalSize2 = 0;
+ m_pBuffer2 = NULL;
m_iBuffered = 0;
m_pCodecContext = NULL;
CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg()
{
- _aligned_free(m_pBuffer2);
Dispose();
}
if (m_pConvert)
m_dllSwResample.swr_free(&m_pConvert);
+ if (m_pBuffer2)
+ m_dllAvUtil.av_freep(&m_pBuffer2);
+
if (m_pCodecContext)
{
if (m_bOpenedCodec) m_dllAvCodec.avcodec_close(m_pCodecContext);
m_iBufferSize1 = 0;
m_iBufferSize2 = 0;
+ m_iBufferTotalSize2 = 0;
m_iBuffered = 0;
}
int iBytesUsed, got_frame;
if (!m_pCodecContext) return -1;
- m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ;
m_iBufferSize2 = 0;
AVPacket avpkt;
}
}
- int len = m_iBufferSize1 / m_dllAvUtil.av_get_bytes_per_sample(m_pCodecContext->sample_fmt);
- if(m_dllSwResample.swr_convert(m_pConvert, &m_pBuffer2, len, (const uint8_t**)m_pFrame1->data, m_pFrame1->nb_samples) < 0)
+ int needed_buf_size = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, AV_SAMPLE_FMT_FLT, 0);
+ if(m_iBufferTotalSize2 < needed_buf_size)
+ {
+ m_pBuffer2 = (uint8_t*)m_dllAvUtil.av_realloc(m_pBuffer2, needed_buf_size);
+ if(!m_pBuffer2)
+ {
+ CLog::Log(LOGERROR, "CDVDAudioCodecFFmpeg::Decode - Unable to allocate a %i bytes buffer for resampling", needed_buf_size);
+ m_iBufferSize1 = 0;
+ m_iBufferSize2 = 0;
+ m_iBufferTotalSize2 = 0;
+ return;
+ }
+ m_iBufferTotalSize2 = needed_buf_size;
+ }
+
+ int outsamples;
+ outsamples = m_dllSwResample.swr_convert(m_pConvert, &m_pBuffer2, m_iBufferTotalSize2, (const uint8_t**)m_pFrame1->extended_data, m_pFrame1->nb_samples);
+
+ if(outsamples < 0)
{
CLog::Log(LOGERROR, "CDVDAudioCodecFFmpeg::Decode - Unable to convert %d to AV_SAMPLE_FMT_FLT", (int)m_pCodecContext->sample_fmt);
m_iBufferSize1 = 0;
return;
}
+ if(outsamples < m_pFrame1->nb_samples)
+ {
+ CLog::Log(LOGWARNING, "CDVDAudioCodecFFmpeg::Decode - Resampler produced less samples than what it was given");
+ }
+
m_iBufferSize1 = 0;
- m_iBufferSize2 = len * m_dllAvUtil.av_get_bytes_per_sample(AV_SAMPLE_FMT_FLT);
+ m_iBufferSize2 = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, AV_SAMPLE_FMT_FLT, 0);
}
}
int m_iBufferSize1;
uint8_t* m_pBuffer2;
int m_iBufferSize2;
+ int m_iBufferTotalSize2;
bool m_bOpenedCodec;
int m_iBuffered;
CDVDAudioCodecLPcm::CDVDAudioCodecLPcm() : CDVDAudioCodecPcm()
{
- m_codecID = CODEC_ID_NONE;
+ m_codecID = AV_CODEC_ID_NONE;
m_bufferSize = LPCM_BUFFER_SIZE;
memset(m_buffer, 0, sizeof(m_buffer));
}
m_codecID = hints.codec;
CDVDStreamInfo hints2(hints, true);
- hints2.codec = CODEC_ID_NONE;
+ hints2.codec = AV_CODEC_ID_NONE;
#if 0
- if (hints.codecID = CODEC_ID_LPCM_S24BE) hints2.codec = CODEC_ID_PCM_S24BE;
+ if (hints.codecID = AV_CODEC_ID_LPCM_S24BE) hints2.codec = AV_CODEC_ID_PCM_S24BE;
#endif
- if (hints2.codec != CODEC_ID_NONE)
+ if (hints2.codec != AV_CODEC_ID_NONE)
return CDVDAudioCodecPcm::Open(hints2, options);
return false;
{
int iDecoded = 0;
#if 0
- if (m_codecID == CODEC_ID_LPCM_S24BE)
+ if (m_codecID == AV_CODEC_ID_LPCM_S24BE)
#endif
{
for (iDecoded = 0; iDecoded <= (iSize - 12); iDecoded += 12)
int m_bufferSize;
uint8_t m_buffer[LPCM_BUFFER_SIZE];
- CodecID m_codecID;
+ AVCodecID m_codecID;
};
m_bufferSize = 0;
if (
- (hints.codec == CODEC_ID_AC3 && bSupportsAC3Out) ||
- (hints.codec == CODEC_ID_DTS && bSupportsDTSOut) ||
+ (hints.codec == AV_CODEC_ID_AC3 && bSupportsAC3Out) ||
+ (hints.codec == AV_CODEC_ID_DTS && bSupportsDTSOut) ||
(audioMode == AUDIO_HDMI &&
(
- (hints.codec == CODEC_ID_EAC3 && bSupportsAC3Out ) ||
- (hints.codec == CODEC_ID_TRUEHD && bSupportsTrueHDOut)
+ (hints.codec == AV_CODEC_ID_EAC3 && bSupportsAC3Out ) ||
+ (hints.codec == AV_CODEC_ID_TRUEHD && bSupportsTrueHDOut)
)
)
)
/* set the stream's parameters */
m_SampleRate = hints.samplerate;
- if(!m_SampleRate && hints.codec == CODEC_ID_AC3)
+ if(!m_SampleRate && hints.codec == AV_CODEC_ID_AC3)
m_SampleRate = 48000;
AVCodecContext *codec = muxer.m_pStream->codec;
{
m_pSyncFrame = NULL;
- if (m_bSupportsAC3Out && hints.codec == CODEC_ID_AC3) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncAC3;
- else if (m_bSupportsDTSOut && hints.codec == CODEC_ID_DTS) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncDTS;
- else if (m_bSupportsAACOut && hints.codec == CODEC_ID_AAC) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncAAC;
+ if (m_bSupportsAC3Out && hints.codec == AV_CODEC_ID_AC3) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncAC3;
+ else if (m_bSupportsDTSOut && hints.codec == AV_CODEC_ID_DTS) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncDTS;
+ else if (m_bSupportsAACOut && hints.codec == AV_CODEC_ID_AAC) m_pSyncFrame = &CDVDAudioCodecPassthroughFFmpeg::SyncAAC;
else return false;
return true;
else
{
/* aac needs to be wrapped into ADTS frames */
- if (hints.codec == CODEC_ID_AAC)
+ if (hints.codec == AV_CODEC_ID_AAC)
if (!SetupMuxer(hints, "adts", m_ADTS))
{
CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::Open - Unable to setup ADTS muxer");
{
switch(m_codec)
{
- case CODEC_ID_AC3: return AE_FMT_AC3;
- case CODEC_ID_DTS: return AE_FMT_DTS;
+ case AV_CODEC_ID_AC3: return AE_FMT_AC3;
+ case AV_CODEC_ID_DTS: return AE_FMT_DTS;
default:
return AE_FMT_INVALID; //Unknown stream type
}
unsigned int m_Needed;
bool m_LostSync;
int m_SampleRate;
- CodecID m_codec;
+ AVCodecID m_codec;
unsigned int (CDVDAudioCodecPassthroughFFmpeg::*m_pSyncFrame)(uint8_t* pData, unsigned int iSize, unsigned int *fSize);
unsigned int SyncAC3(uint8_t* pData, unsigned int iSize, unsigned int *fSize);
m_iSourceSampleRate = 0;
m_iSourceBitrate = 0;
m_decodedDataSize = 0;
- m_codecID = CODEC_ID_NONE;
+ m_codecID = AV_CODEC_ID_NONE;
m_iOutputChannels = 0;
memset(m_decodedData, 0, sizeof(m_decodedData));
switch (m_codecID)
{
- case CODEC_ID_PCM_ALAW:
+ case AV_CODEC_ID_PCM_ALAW:
{
for (int i = 0; i < 256; i++) table[i] = alaw2linear(i);
break;
}
- case CODEC_ID_PCM_MULAW:
+ case AV_CODEC_ID_PCM_MULAW:
{
for (int i = 0; i < 256; i++) table[i] = ulaw2linear(i);
break;
switch (m_codecID)
{
- case CODEC_ID_PCM_S32LE:
+ case AV_CODEC_ID_PCM_S32LE:
decode_to16(4, 1, 0, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_S32BE:
+ case AV_CODEC_ID_PCM_S32BE:
decode_to16(4, 0, 0, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_U32LE:
+ case AV_CODEC_ID_PCM_U32LE:
decode_to16(4, 1, 1, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_U32BE:
+ case AV_CODEC_ID_PCM_U32BE:
decode_to16(4, 0, 1, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_S24LE:
+ case AV_CODEC_ID_PCM_S24LE:
decode_to16(3, 1, 0, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_S24BE:
+ case AV_CODEC_ID_PCM_S24BE:
decode_to16(3, 0, 0, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_U24LE:
+ case AV_CODEC_ID_PCM_U24LE:
decode_to16(3, 1, 1, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_U24BE:
+ case AV_CODEC_ID_PCM_U24BE:
decode_to16(3, 0, 1, &src, &samples, buf_size);
break;
- case CODEC_ID_PCM_S24DAUD:
+ case AV_CODEC_ID_PCM_S24DAUD:
n = buf_size / 3;
for(;n>0;n--) {
uint32_t v = src[0] << 16 | src[1] << 8 | src[2];
src += 3;
}
break;
- case CODEC_ID_PCM_S16LE:
+ case AV_CODEC_ID_PCM_S16LE:
n = buf_size >> 1;
for(;n>0;n--) {
*samples++ = src[0] | (src[1] << 8);
src += 2;
}
break;
- case CODEC_ID_PCM_S16BE:
+ case AV_CODEC_ID_PCM_S16BE:
n = buf_size >> 1;
for(;n>0;n--) {
*samples++ = (src[0] << 8) | src[1];
src += 2;
}
break;
- case CODEC_ID_PCM_U16LE:
+ case AV_CODEC_ID_PCM_U16LE:
n = buf_size >> 1;
for(;n>0;n--) {
*samples++ = (src[0] | (src[1] << 8)) - 0x8000;
src += 2;
}
break;
- case CODEC_ID_PCM_U16BE:
+ case AV_CODEC_ID_PCM_U16BE:
n = buf_size >> 1;
for(;n>0;n--) {
*samples++ = ((src[0] << 8) | src[1]) - 0x8000;
src += 2;
}
break;
- case CODEC_ID_PCM_S8:
+ case AV_CODEC_ID_PCM_S8:
n = buf_size;
for(;n>0;n--) {
*samples++ = src[0] << 8;
src++;
}
break;
- case CODEC_ID_PCM_U8:
+ case AV_CODEC_ID_PCM_U8:
n = buf_size;
for(;n>0;n--) {
*samples++ = ((int)src[0] - 128) << 8;
src++;
}
break;
- case CODEC_ID_PCM_ALAW:
- case CODEC_ID_PCM_MULAW:
+ case AV_CODEC_ID_PCM_ALAW:
+ case AV_CODEC_ID_PCM_MULAW:
n = buf_size;
for(;n>0;n--) {
*samples++ = table[src[0]];
m_iSourceSampleRate = 0;
m_iSourceBitrate = 0;
m_decodedDataSize = 0;
- m_codecID = CODEC_ID_NONE;
+ m_codecID = AV_CODEC_ID_NONE;
}
void CDVDAudioCodecPcm::Reset()
short m_decodedData[131072]; // could be a bit to big
int m_decodedDataSize;
- CodecID m_codecID;
+ AVCodecID m_codecID;
int m_iSourceSampleRate;
int m_iSourceChannels;
int m_iSourceBitrate;
CLog::Log(LOGDEBUG, "CDVDFactoryCodec: compiled in hardware support: %s", hwSupport.c_str());
#if !defined(HAS_LIBAMCODEC)
// dvd's have weird still-frames in it, which is not fully supported in ffmpeg
- if(hint.stills && (hint.codec == CODEC_ID_MPEG2VIDEO || hint.codec == CODEC_ID_MPEG1VIDEO))
+ if(hint.stills && (hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO))
{
if( (pCodec = OpenCodec(new CDVDVideoCodecLibMpeg2(), hint, options)) ) return pCodec;
}
#if defined(TARGET_DARWIN_OSX)
if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda"))
{
- if (hint.codec == CODEC_ID_H264 && !hint.ptsinvalid)
+ if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid)
{
if ( (pCodec = OpenCodec(new CDVDVideoCodecVDA(), hint, options)) ) return pCodec;
}
{
switch(hint.codec)
{
- case CODEC_ID_H264:
- if (hint.codec == CODEC_ID_H264 && hint.ptsinvalid)
+ case AV_CODEC_ID_H264:
+ if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid)
break;
if ( (pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(), hint, options)) ) return pCodec;
break;
{
switch(hint.codec)
{
- case CODEC_ID_VC1:
- case CODEC_ID_WMV3:
- case CODEC_ID_H264:
- case CODEC_ID_MPEG2VIDEO:
- if (hint.codec == CODEC_ID_H264 && hint.ptsinvalid)
+ case AV_CODEC_ID_VC1:
+ case AV_CODEC_ID_WMV3:
+ case AV_CODEC_ID_H264:
+ case AV_CODEC_ID_MPEG2VIDEO:
+ if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid)
break;
- if (hint.codec == CODEC_ID_MPEG2VIDEO && hint.width <= 720)
+ if (hint.codec == AV_CODEC_ID_MPEG2VIDEO && hint.width <= 720)
break;
if ( (pCodec = OpenCodec(new CDVDVideoCodecCrystalHD(), hint, options)) ) return pCodec;
break;
#if defined(HAVE_LIBOPENMAX)
if (CSettings::Get().GetBool("videoplayer.useomx") && !hint.software )
{
- if (hint.codec == CODEC_ID_H264 || hint.codec == CODEC_ID_MPEG2VIDEO || hint.codec == CODEC_ID_VC1)
+ if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VC1)
{
if ( (pCodec = OpenCodec(new CDVDVideoCodecOpenMax(), hint, options)) ) return pCodec;
}
#if defined(TARGET_DARWIN_OSX) || defined(TARGET_DARWIN_IOS)
switch(hint.codec)
{
- case CODEC_ID_AC3:
- case CODEC_ID_DTS:
+ case AV_CODEC_ID_AC3:
+ case AV_CODEC_ID_DTS:
pCodec = OpenCodec( new CDVDAudioCodecPassthroughFFmpeg(), hint, options );
if( pCodec ) return pCodec;
break;
switch (hint.codec)
{
- case CODEC_ID_MP2:
- case CODEC_ID_MP3:
+ case AV_CODEC_ID_MP2:
+ case AV_CODEC_ID_MP3:
{
pCodec = OpenCodec( new CDVDAudioCodecLibMad(), hint, options );
if( pCodec ) return pCodec;
break;
}
- case CODEC_ID_PCM_S32LE:
- case CODEC_ID_PCM_S32BE:
- case CODEC_ID_PCM_U32LE:
- case CODEC_ID_PCM_U32BE:
- case CODEC_ID_PCM_S24LE:
- case CODEC_ID_PCM_S24BE:
- case CODEC_ID_PCM_U24LE:
- case CODEC_ID_PCM_U24BE:
- case CODEC_ID_PCM_S24DAUD:
- case CODEC_ID_PCM_S16LE:
- case CODEC_ID_PCM_S16BE:
- case CODEC_ID_PCM_U16LE:
- case CODEC_ID_PCM_U16BE:
- case CODEC_ID_PCM_S8:
- case CODEC_ID_PCM_U8:
- case CODEC_ID_PCM_ALAW:
- case CODEC_ID_PCM_MULAW:
+ case AV_CODEC_ID_PCM_S32LE:
+ case AV_CODEC_ID_PCM_S32BE:
+ case AV_CODEC_ID_PCM_U32LE:
+ case AV_CODEC_ID_PCM_U32BE:
+ case AV_CODEC_ID_PCM_S24LE:
+ case AV_CODEC_ID_PCM_S24BE:
+ case AV_CODEC_ID_PCM_U24LE:
+ case AV_CODEC_ID_PCM_U24BE:
+ case AV_CODEC_ID_PCM_S24DAUD:
+ case AV_CODEC_ID_PCM_S16LE:
+ case AV_CODEC_ID_PCM_S16BE:
+ case AV_CODEC_ID_PCM_U16LE:
+ case AV_CODEC_ID_PCM_U16BE:
+ case AV_CODEC_ID_PCM_S8:
+ case AV_CODEC_ID_PCM_U8:
+ case AV_CODEC_ID_PCM_ALAW:
+ case AV_CODEC_ID_PCM_MULAW:
{
pCodec = OpenCodec( new CDVDAudioCodecPcm(), hint, options );
if( pCodec ) return pCodec;
break;
}
#if 0
- //case CODEC_ID_LPCM_S16BE:
- //case CODEC_ID_LPCM_S20BE:
- case CODEC_ID_LPCM_S24BE:
+ //case AV_CODEC_ID_LPCM_S16BE:
+ //case AV_CODEC_ID_LPCM_S20BE:
+ case AV_CODEC_ID_LPCM_S24BE:
{
pCodec = OpenCodec( new CDVDAudioCodecLPcm(), hint, options );
if( pCodec ) return pCodec;
switch (hint.codec)
{
- case CODEC_ID_TEXT:
+ case AV_CODEC_ID_TEXT:
#if defined(LIBAVCODEC_FROM_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54,53,100)
// API changed in:
// ffmpeg: commit 2626cc4580bfd560c6983338d77b2c11c16af94f (11 Aug 2012)
if( pCodec ) return pCodec;
break;
- case CODEC_ID_SSA:
+ case AV_CODEC_ID_SSA:
pCodec = OpenCodec(new CDVDOverlayCodecSSA(), hint, options);
if( pCodec ) return pCodec;
if( pCodec ) return pCodec;
break;
- case CODEC_ID_MOV_TEXT:
+ case AV_CODEC_ID_MOV_TEXT:
pCodec = OpenCodec(new CDVDOverlayCodecTX3G(), hint, options);
if( pCodec ) return pCodec;
break;
double pts_offset = 0.0;
- if (m_pCodecContext->codec_id == CODEC_ID_HDMV_PGS_SUBTITLE && m_Subtitle.format == 0)
+ if (m_pCodecContext->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && m_Subtitle.format == 0)
{
// for pgs subtitles the packet pts of the end_segments are wrong
// instead use the subtitle pts to calc the offset here
bool CDVDOverlayCodecSSA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
{
- if(hints.codec != CODEC_ID_SSA)
+ if(hints.codec != AV_CODEC_ID_SSA)
return false;
Dispose();
bool CDVDOverlayCodecTX3G::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
{
- if (hints.codec == CODEC_ID_MOV_TEXT)
+ if (hints.codec == AV_CODEC_ID_MOV_TEXT)
return true;
return false;
}
bool CDVDOverlayCodecText::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
{
- m_bIsSSA = (hints.codec == CODEC_ID_SSA);
- if(hints.codec == CODEC_ID_TEXT || hints.codec == CODEC_ID_SSA)
+ m_bIsSSA = (hints.codec == AV_CODEC_ID_SSA);
+ if(hints.codec == AV_CODEC_ID_TEXT || hints.codec == AV_CODEC_ID_SSA)
return true;
#if defined(LIBAVCODEC_FROM_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54,53,100)
// API changed in:
return -1;
}
-static vformat_t codecid_to_vformat(enum CodecID id)
+static vformat_t codecid_to_vformat(enum AVCodecID id)
{
vformat_t format;
switch (id)
{
- case CODEC_ID_MPEG1VIDEO:
- case CODEC_ID_MPEG2VIDEO:
- case CODEC_ID_MPEG2VIDEO_XVMC:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO_XVMC:
format = VFORMAT_MPEG12;
break;
- case CODEC_ID_H263:
- case CODEC_ID_MPEG4:
- case CODEC_ID_H263P:
- case CODEC_ID_H263I:
- case CODEC_ID_MSMPEG4V2:
- case CODEC_ID_MSMPEG4V3:
- case CODEC_ID_FLV1:
+ case AV_CODEC_ID_H263:
+ case AV_CODEC_ID_MPEG4:
+ case AV_CODEC_ID_H263P:
+ case AV_CODEC_ID_H263I:
+ case AV_CODEC_ID_MSMPEG4V2:
+ case AV_CODEC_ID_MSMPEG4V3:
+ case AV_CODEC_ID_FLV1:
format = VFORMAT_MPEG4;
break;
- case CODEC_ID_RV10:
- case CODEC_ID_RV20:
- case CODEC_ID_RV30:
- case CODEC_ID_RV40:
+ case AV_CODEC_ID_RV10:
+ case AV_CODEC_ID_RV20:
+ case AV_CODEC_ID_RV30:
+ case AV_CODEC_ID_RV40:
format = VFORMAT_REAL;
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
format = VFORMAT_H264;
break;
/*
- case CODEC_ID_H264MVC:
+ case AV_CODEC_ID_H264MVC:
// H264 Multiview Video Coding (3d blurays)
format = VFORMAT_H264MVC;
break;
*/
- case CODEC_ID_MJPEG:
+ case AV_CODEC_ID_MJPEG:
format = VFORMAT_MJPEG;
break;
- case CODEC_ID_VC1:
- case CODEC_ID_WMV3:
+ case AV_CODEC_ID_VC1:
+ case AV_CODEC_ID_WMV3:
format = VFORMAT_VC1;
break;
- case CODEC_ID_AVS:
- case CODEC_ID_CAVS:
+ case AV_CODEC_ID_AVS:
+ case AV_CODEC_ID_CAVS:
format = VFORMAT_AVS;
break;
case CODEC_TAG_RMP4:
case CODEC_TAG_MPG4:
case CODEC_TAG_mp4v:
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
// mp4
dec_type = VIDEO_DEC_FORMAT_MPEG4_5;
break;
- case CODEC_ID_H263:
+ case AV_CODEC_ID_H263:
case CODEC_TAG_H263:
case CODEC_TAG_h263:
case CODEC_TAG_s263:
case CODEC_TAG_avc1:
case CODEC_TAG_H264:
case CODEC_TAG_h264:
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
// h264
dec_type = VIDEO_DEC_FORMAT_H264;
break;
/*
- case CODEC_ID_H264MVC:
+ case AV_CODEC_ID_H264MVC:
dec_type = VIDEO_DEC_FORMAT_H264;
break;
*/
- case CODEC_ID_RV30:
+ case AV_CODEC_ID_RV30:
case CODEC_TAG_RV30:
// realmedia 3
dec_type = VIDEO_DEC_FORMAT_REAL_8;
break;
- case CODEC_ID_RV40:
+ case AV_CODEC_ID_RV40:
case CODEC_TAG_RV40:
// realmedia 4
dec_type = VIDEO_DEC_FORMAT_REAL_9;
// wmv3
dec_type = VIDEO_DEC_FORMAT_WMV3;
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
case CODEC_TAG_VC_1:
case CODEC_TAG_WVC1:
case CODEC_TAG_WMVA:
// vc1
dec_type = VIDEO_DEC_FORMAT_WVC1;
break;
- case CODEC_ID_VP6F:
+ case AV_CODEC_ID_VP6F:
// vp6
dec_type = VIDEO_DEC_FORMAT_SW;
break;
- case CODEC_ID_CAVS:
- case CODEC_ID_AVS:
+ case AV_CODEC_ID_CAVS:
+ case AV_CODEC_ID_AVS:
// avs
dec_type = VIDEO_DEC_FORMAT_AVS;
break;
return PLAYER_NOMEM;
}
}
- if (( CODEC_ID_MPEG1VIDEO == para->video_codec_id)
- || (CODEC_ID_MPEG2VIDEO == para->video_codec_id)
- || (CODEC_ID_MPEG2VIDEO_XVMC == para->video_codec_id)) {
+ if (( AV_CODEC_ID_MPEG1VIDEO == para->video_codec_id)
+ || (AV_CODEC_ID_MPEG2VIDEO == para->video_codec_id)
+ || (AV_CODEC_ID_MPEG2VIDEO_XVMC == para->video_codec_id)) {
ret = mpeg_add_header(para, pkt);
if (ret != PLAYER_SUCCESS) {
return ret;
// check for SD h264 content incorrectly reported as 60 fsp
// mp4/avi containers :(
- if (hints.codec == CODEC_ID_H264 && hints.width <= 720 && am_private->video_rate == 1602)
+ if (hints.codec == AV_CODEC_ID_H264 && hints.width <= 720 && am_private->video_rate == 1602)
{
CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder video_rate exception");
am_private->video_rate = 0.5 + (float)UNIT_FREQ * 1001 / 24000;
// check for SD h264 content incorrectly reported as some form of 30 fsp
// mp4/avi containers :(
- if (hints.codec == CODEC_ID_H264 && hints.width <= 720)
+ if (hints.codec == AV_CODEC_ID_H264 && hints.width <= 720)
{
if (am_private->video_rate >= 3200 && am_private->video_rate <= 3210)
{
am_private->video_codec_type = codec_tag_to_vdec_type(am_private->video_codec_id);
am_private->flv_flag = 0;
- if (am_private->video_codec_id == CODEC_ID_FLV1)
+ if (am_private->video_codec_id == AV_CODEC_ID_FLV1)
{
am_private->video_codec_tag = CODEC_TAG_F263;
am_private->flv_flag = 1;
{
switch(hints.codec)
{
- case CODEC_ID_MJPEG:
+ case AV_CODEC_ID_MJPEG:
m_pFormatName = "am-mjpeg";
break;
- case CODEC_ID_MPEG1VIDEO:
- case CODEC_ID_MPEG2VIDEO:
- case CODEC_ID_MPEG2VIDEO_XVMC:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO_XVMC:
m_mpeg2_sequence_pts = 0;
m_mpeg2_sequence = new mpeg2_sequence;
m_mpeg2_sequence->width = hints.width;
m_mpeg2_sequence->rate = 1.0;
m_pFormatName = "am-mpeg2";
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
m_pFormatName = "am-h264";
break;
- case CODEC_ID_MPEG4:
- case CODEC_ID_MSMPEG4V2:
- case CODEC_ID_MSMPEG4V3:
+ case AV_CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MSMPEG4V2:
+ case AV_CODEC_ID_MSMPEG4V3:
m_pFormatName = "am-mpeg4";
break;
- case CODEC_ID_H263:
- case CODEC_ID_H263P:
- case CODEC_ID_H263I:
+ case AV_CODEC_ID_H263:
+ case AV_CODEC_ID_H263P:
+ case AV_CODEC_ID_H263I:
m_pFormatName = "am-h263";
break;
- case CODEC_ID_FLV1:
+ case AV_CODEC_ID_FLV1:
m_pFormatName = "am-flv1";
break;
- case CODEC_ID_RV10:
- case CODEC_ID_RV20:
- case CODEC_ID_RV30:
- case CODEC_ID_RV40:
+ case AV_CODEC_ID_RV10:
+ case AV_CODEC_ID_RV20:
+ case AV_CODEC_ID_RV30:
+ case AV_CODEC_ID_RV40:
m_pFormatName = "am-rv";
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
m_pFormatName = "am-vc1";
break;
- case CODEC_ID_WMV3:
+ case AV_CODEC_ID_WMV3:
m_pFormatName = "am-wmv3";
break;
- case CODEC_ID_AVS:
- case CODEC_ID_CAVS:
+ case AV_CODEC_ID_AVS:
+ case AV_CODEC_ID_CAVS:
m_pFormatName = "am-avs";
break;
default:
{
switch (hints.codec)
{
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
m_CodecType = CRYSTALHD_CODEC_ID_MPEG2;
m_pFormatName = "chd-mpeg2";
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
switch(hints.profile)
{
case FF_PROFILE_H264_HIGH_10:
m_pFormatName = "chd-h264";
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
m_CodecType = CRYSTALHD_CODEC_ID_VC1;
m_pFormatName = "chd-vc1";
break;
- case CODEC_ID_WMV3:
+ case AV_CODEC_ID_WMV3:
m_CodecType = CRYSTALHD_CODEC_ID_WMV3;
m_pFormatName = "chd-wmv3";
break;
#ifdef HAVE_LIBVA
// mpeg4 vaapi decoding is disabled
if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi")
- && (avctx->codec_id != CODEC_ID_MPEG4 || g_advancedSettings.m_videoAllowMpeg4VAAPI))
+ && (avctx->codec_id != AV_CODEC_ID_MPEG4 || g_advancedSettings.m_videoAllowMpeg4VAAPI))
{
if (ctx->GetHardware() != NULL)
{
pCodec = NULL;
m_pCodecContext = NULL;
- if (hints.codec == CODEC_ID_H264)
+ if (hints.codec == AV_CODEC_ID_H264)
{
switch(hints.profile)
{
// ffmpeg with enabled neon will crash and burn if this is enabled
m_pCodecContext->flags &= CODEC_FLAG_EMU_EDGE;
#else
- if (pCodec->id != CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1
- && pCodec->id != CODEC_ID_VP8
+ if (pCodec->id != AV_CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1
+ && pCodec->id != AV_CODEC_ID_VP8
)
m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE;
#endif
int num_threads = std::min(8 /*MAX_THREADS*/, g_cpuInfo.getCPUCount());
if( num_threads > 1 && !hints.software && m_pHardware == NULL // thumbnail extraction fails when run threaded
- && ( pCodec->id == CODEC_ID_H264
- || pCodec->id == CODEC_ID_MPEG4 ))
+ && ( pCodec->id == AV_CODEC_ID_H264
+ || pCodec->id == AV_CODEC_ID_MPEG4 ))
m_pCodecContext->thread_count = num_threads;
if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0)
m_iLastKeyframe = 300;
/* h264 doesn't always have keyframes + won't output before first keyframe anyway */
- if(m_pCodecContext->codec_id == CODEC_ID_H264
- || m_pCodecContext->codec_id == CODEC_ID_SVQ3)
+ if(m_pCodecContext->codec_id == AV_CODEC_ID_H264
+ || m_pCodecContext->codec_id == AV_CODEC_ID_SVQ3)
m_started = true;
if(m_pHardware == NULL)
switch (hints.codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
{
m_pFormatName = "omx-h264";
if (hints.extrasize < 7 || hints.extradata == NULL)
m_convert_bitstream = bitstream_convert_init(hints.extradata, hints.extrasize);
}
break;
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
m_pFormatName = "omx-mpeg4";
break;
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
m_pFormatName = "omx-mpeg2";
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
m_pFormatName = "omx-vc1";
break;
default:
CFDataRef avcCData;
switch (hints.codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
m_bitstream = new CBitstreamConverter;
if (!m_bitstream->Open(hints.codec, (uint8_t*)hints.extradata, hints.extrasize, false))
return false;
esds->esid = 0;
esds->stream_priority = 0; // 16 ? 0x1f
- esds->objectTypeId = 32; // 32 = CODEC_ID_MPEG4, 33 = CODEC_ID_H264
+ esds->objectTypeId = 32; // 32 = AV_CODEC_ID_MPEG4, 33 = AV_CODEC_ID_H264
// the following fields is made of 6 bits to identify the streamtype (4 for video, 5 for audio)
// plus 1 bit to indicate upstream and 1 bit set to 1 (reserved)
esds->streamType = 0x11;
switch (hints.codec)
{
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
if (extrasize)
{
AVIOContext *pb;
m_pFormatName = "vtb-mpeg4";
break;
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
m_fmt_desc = CreateFormatDescription(kVTFormatMPEG2Video, width, height);
m_pFormatName = "vtb-mpeg2";
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
if (extrasize < 7 || extradata == NULL)
{
//m_fmt_desc = CreateFormatDescription(kVTFormatH264, width, height);
/* XXX Prefered modes must come first */
static const dxva2_mode_t dxva2_modes[] = {
- { "MPEG2 VLD", &DXVA2_ModeMPEG2_VLD, CODEC_ID_MPEG2VIDEO },
- { "MPEG1/2 VLD", &DXVA_ModeMPEG2and1_VLD, CODEC_ID_MPEG2VIDEO },
+ { "MPEG2 VLD", &DXVA2_ModeMPEG2_VLD, AV_CODEC_ID_MPEG2VIDEO },
+ { "MPEG1/2 VLD", &DXVA_ModeMPEG2and1_VLD, AV_CODEC_ID_MPEG2VIDEO },
{ "MPEG2 MoComp", &DXVA2_ModeMPEG2_MoComp, 0 },
{ "MPEG2 IDCT", &DXVA2_ModeMPEG2_IDCT, 0 },
// Intel drivers return standard modes in addition to the Intel specific ones. Try the Intel specific first, they work better for Sandy Bridges.
- { "Intel H.264 VLD, no FGT", &DXVADDI_Intel_ModeH264_E, CODEC_ID_H264 },
+ { "Intel H.264 VLD, no FGT", &DXVADDI_Intel_ModeH264_E, AV_CODEC_ID_H264 },
{ "Intel H.264 inverse discrete cosine transform (IDCT), no FGT", &DXVADDI_Intel_ModeH264_C, 0 },
{ "Intel H.264 motion compensation (MoComp), no FGT", &DXVADDI_Intel_ModeH264_A, 0 },
{ "Intel VC-1 VLD", &DXVADDI_Intel_ModeVC1_E, 0 },
- { "H.264 variable-length decoder (VLD), FGT", &DXVA2_ModeH264_F, CODEC_ID_H264 },
- { "H.264 VLD, no FGT", &DXVA2_ModeH264_E, CODEC_ID_H264 },
+ { "H.264 variable-length decoder (VLD), FGT", &DXVA2_ModeH264_F, AV_CODEC_ID_H264 },
+ { "H.264 VLD, no FGT", &DXVA2_ModeH264_E, AV_CODEC_ID_H264 },
{ "H.264 IDCT, FGT", &DXVA2_ModeH264_D, 0, },
{ "H.264 inverse discrete cosine transform (IDCT), no FGT", &DXVA2_ModeH264_C, 0, },
{ "H.264 MoComp, FGT", &DXVA2_ModeH264_B, 0, },
{ "Windows Media Video 9 MoComp", &DXVA2_ModeWMV9_B, 0 },
{ "Windows Media Video 9 post processing", &DXVA2_ModeWMV9_A, 0 },
- { "VC-1 VLD", &DXVA2_ModeVC1_D, CODEC_ID_VC1 },
- { "VC-1 VLD", &DXVA2_ModeVC1_D, CODEC_ID_WMV3 },
- { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, CODEC_ID_VC1 },
- { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, CODEC_ID_WMV3 },
+ { "VC-1 VLD", &DXVA2_ModeVC1_D, AV_CODEC_ID_VC1 },
+ { "VC-1 VLD", &DXVA2_ModeVC1_D, AV_CODEC_ID_WMV3 },
+ { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, AV_CODEC_ID_VC1 },
+ { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, AV_CODEC_ID_WMV3 },
{ "VC-1 IDCT", &DXVA2_ModeVC1_C, 0 },
{ "VC-1 MoComp", &DXVA2_ModeVC1_B, 0 },
{ "VC-1 post processing", &DXVA2_ModeVC1_A, 0 },
static bool CheckCompatibility(AVCodecContext *avctx)
{
// The incompatibilities are all for H264
- if(avctx->codec_id != CODEC_ID_H264)
+ if(avctx->codec_id != AV_CODEC_ID_H264)
return true;
// Macroblock width incompatibility
if(m_refs == 0)
{
- if(avctx->codec_id == CODEC_ID_H264)
+ if(avctx->codec_id == AV_CODEC_ID_H264)
m_refs = 16;
else
m_refs = 2;
}
// Status reports are available only for the DXVA2_ModeH264 and DXVA2_ModeVC1 modes
- if(avctx->codec_id != CODEC_ID_H264
- && avctx->codec_id != CODEC_ID_VC1
- && avctx->codec_id != CODEC_ID_WMV3)
+ if(avctx->codec_id != AV_CODEC_ID_H264
+ && avctx->codec_id != AV_CODEC_ID_VC1
+ && avctx->codec_id != AV_CODEC_ID_WMV3)
return 0;
DXVA2_DecodeExecuteParams params = {};
params.pExtensionData = &data;
data.Function = DXVA_STATUS_REPORTING_FUNCTION;
data.pPrivateOutputData = &status;
- data.PrivateOutputDataSize = avctx->codec_id == CODEC_ID_H264 ? sizeof(DXVA_Status_H264) : sizeof(DXVA_Status_VC1);
+ data.PrivateOutputDataSize = avctx->codec_id == AV_CODEC_ID_H264 ? sizeof(DXVA_Status_H264) : sizeof(DXVA_Status_VC1);
HRESULT hr;
if(FAILED( hr = m_decoder->Execute(¶ms)))
{
return VC_ERROR;
}
- if(avctx->codec_id == CODEC_ID_H264)
+ if(avctx->codec_id == AV_CODEC_ID_H264)
{
if(status.h264.bStatus)
CLog::Log(LOGWARNING, "DXVA - decoder problem of status %d with %d", status.h264.bStatus, status.h264.bBufType);
D3DFORMAT rtFormat = D3DFMT_X8R8G8B8;
CHECK(m_service->GetVideoProcessorCaps(m_device, &m_desc, rtFormat, &m_caps))
+ /* HACK for Intel Egde Device.
+ * won't work if backward refs is equals value from the capabilities *
+ * Possible reasons are: *
+ * 1) The device capabilities are incorrectly reported *
+ * 2) The device is broken */
+ if (IsEqualGUID(m_device, DXVA2_VideoProcIntelEdgeDevice))
+ m_caps.NumBackwardRefSamples = 0;
+
if (m_caps.DeviceCaps & DXVA2_VPDev_SoftwareDevice)
CLog::Log(LOGDEBUG, "DXVA - processor is software device");
switch (hints.codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
{
switch(hints.profile)
{
}
}
break;
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
// (role name) video_decoder.mpeg4
// MPEG-4, DivX 4/5 and Xvid compatible
decoder_name = OMX_MPEG4_DECODER;
m_pFormatName = "omx-mpeg4";
break;
*/
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
// (role name) video_decoder.mpeg2
// MPEG-2
decoder_name = OMX_MPEG2V_DECODER;
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
// (role name) video_decoder.vc1
// VC-1, WMV9
decoder_name = OMX_VC1_DECODER;
vector<VAProfile> accepted;
switch (avctx->codec_id) {
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
accepted.push_back(VAProfileMPEG2Main);
break;
- case CODEC_ID_MPEG4:
- case CODEC_ID_H263:
+ case AV_CODEC_ID_MPEG4:
+ case AV_CODEC_ID_H263:
accepted.push_back(VAProfileMPEG4AdvancedSimple);
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
{
#ifdef FF_PROFILE_H264_BASELINE
if (avctx->profile == FF_PROFILE_H264_BASELINE)
}
break;
}
- case CODEC_ID_WMV3:
+ case AV_CODEC_ID_WMV3:
accepted.push_back(VAProfileVC1Main);
break;
- case CODEC_ID_VC1:
+ case AV_CODEC_ID_VC1:
accepted.push_back(VAProfileVC1Advanced);
break;
default:
m_refs = avctx->refs;
if(m_refs == 0)
{
- if(avctx->codec_id == CODEC_ID_H264)
+ if(avctx->codec_id == AV_CODEC_ID_H264)
m_refs = 16;
else
m_refs = 2;
return false;
}
- if ((avctx->codec_id == CODEC_ID_MPEG4) && !g_advancedSettings.m_videoAllowMpeg4VDPAU)
+ if ((avctx->codec_id == AV_CODEC_ID_MPEG4) && !g_advancedSettings.m_videoAllowMpeg4VDPAU)
return false;
if (!dl_handle)
SpewHardwareAvailable();
VdpDecoderProfile profile = 0;
- if(avctx->codec_id == CODEC_ID_H264)
+ if(avctx->codec_id == AV_CODEC_ID_H264)
profile = VDP_DECODER_PROFILE_H264_HIGH;
#ifdef VDP_DECODER_PROFILE_MPEG4_PART2_ASP
- else if(avctx->codec_id == CODEC_ID_MPEG4)
+ else if(avctx->codec_id == AV_CODEC_ID_MPEG4)
profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
#endif
if(profile)
{
char sInfo[64];
- if (codec == CODEC_ID_AC3) strcpy(sInfo, "AC3 ");
- else if (codec == CODEC_ID_DTS)
+ if (codec == AV_CODEC_ID_AC3) strcpy(sInfo, "AC3 ");
+ else if (codec == AV_CODEC_ID_DTS)
{
#ifdef FF_PROFILE_DTS_HD_MA
if (profile == FF_PROFILE_DTS_HD_MA)
#endif
strcpy(sInfo, "DTS ");
}
- else if (codec == CODEC_ID_MP2) strcpy(sInfo, "MP2 ");
- else if (codec == CODEC_ID_TRUEHD) strcpy(sInfo, "Dolby TrueHD ");
+ else if (codec == AV_CODEC_ID_MP2) strcpy(sInfo, "MP2 ");
+ else if (codec == AV_CODEC_ID_TRUEHD) strcpy(sInfo, "Dolby TrueHD ");
else strcpy(sInfo, "");
if (iChannels == 1) strcat(sInfo, "Mono");
#include "config.h"
#endif
#ifndef TARGET_POSIX
-// enum CodecID; // auto defined when neccesary
+// enum AVCodecID; // auto defined when neccesary
#include <libavcodec/avcodec.h>
#else
extern "C" {
{
iId = 0;
iPhysicalId = 0;
- codec = (CodecID)0; // CODEC_ID_NONE
+ codec = (AVCodecID)0; // AV_CODEC_ID_NONE
codec_fourcc = 0;
profile = FF_PROFILE_UNKNOWN;
level = 0;
int iId; // most of the time starting from 0
int iPhysicalId; // id
- CodecID codec;
+ AVCodecID codec;
unsigned int codec_fourcc; // if available
int profile; // encoder profile of the stream reported by the decoder. used to qualify hw decoders.
int level; // encoder level of the stream reported by the decoder. used to qualify hw decoders.
m_stream->iBitRate = m_header.sampleRate * m_header.channels * m_header.bitsPerSample;
m_stream->iChannels = m_header.channels;
m_stream->type = STREAM_AUDIO;
- m_stream->codec = CODEC_ID_PCM_S16LE;
+ m_stream->codec = AV_CODEC_ID_PCM_S16LE;
return true;
}
m_stream->iBitRate = 44100 * 2 * 16;
m_stream->iChannels = 2;
m_stream->type = STREAM_AUDIO;
- m_stream->codec = CODEC_ID_PCM_S16LE;
+ m_stream->codec = AV_CODEC_ID_PCM_S16LE;
return true;
}
CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str());
if (m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD)
|| m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY)
- || (m_pFormatContext->nb_streams == 1 && m_pFormatContext->streams[0]->codec->codec_id == CODEC_ID_AC3))
+ || (m_pFormatContext->nb_streams == 1 && m_pFormatContext->streams[0]->codec->codec_id == AV_CODEC_ID_AC3))
{
// special case, our codecs can still handle it.
}
}
// we need to get duration slightly different for matroska embedded text subtitels
- if(m_bMatroska && stream->codec->codec_id == CODEC_ID_TEXT && m_pkt.pkt.convergence_duration != 0)
+ if(m_bMatroska && stream->codec->codec_id == AV_CODEC_ID_TEXT && m_pkt.pkt.convergence_duration != 0)
m_pkt.pkt.duration = m_pkt.pkt.convergence_duration;
if(m_bAVI && stream->codec && stream->codec->codec_type == AVMEDIA_TYPE_VIDEO)
st->bVFR = false;
// never trust pts in avi files with h264.
- if (m_bAVI && pStream->codec->codec_id == CODEC_ID_H264)
+ if (m_bAVI && pStream->codec->codec_id == AV_CODEC_ID_H264)
st->bPTSInvalid = true;
//average fps is more accurate for mkv files
if ( m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD) )
{
- if (pStream->codec->codec_id == CODEC_ID_PROBE)
+ if (pStream->codec->codec_id == AV_CODEC_ID_PROBE)
{
- // fix MPEG-1/MPEG-2 video stream probe returning CODEC_ID_PROBE for still frames.
+ // fix MPEG-1/MPEG-2 video stream probe returning AV_CODEC_ID_PROBE for still frames.
// ffmpeg issue 1871, regression from ffmpeg r22831.
if ((pStream->id & 0xF0) == 0xE0)
{
- pStream->codec->codec_id = CODEC_ID_MPEG2VIDEO;
+ pStream->codec->codec_id = AV_CODEC_ID_MPEG2VIDEO;
pStream->codec->codec_tag = MKTAG('M','P','2','V');
- CLog::Log(LOGERROR, "%s - CODEC_ID_PROBE detected, forcing CODEC_ID_MPEG2VIDEO", __FUNCTION__);
+ CLog::Log(LOGERROR, "%s - AV_CODEC_ID_PROBE detected, forcing AV_CODEC_ID_MPEG2VIDEO", __FUNCTION__);
}
}
}
}
case AVMEDIA_TYPE_SUBTITLE:
{
- if (pStream->codec->codec_id == CODEC_ID_DVB_TELETEXT && CSettings::Get().GetBool("videoplayer.teletextenabled"))
+ if (pStream->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT && CSettings::Get().GetBool("videoplayer.teletextenabled"))
{
CDemuxStreamTeletext* st = new CDemuxStreamTeletext();
stream = st;
}
case AVMEDIA_TYPE_ATTACHMENT:
{ //mkv attachments. Only bothering with fonts for now.
- if(pStream->codec->codec_id == CODEC_ID_TTF
+ if(pStream->codec->codec_id == AV_CODEC_ID_TTF
#if (!defined USE_EXTERNAL_FFMPEG)
- || pStream->codec->codec_id == CODEC_ID_OTF
+ || pStream->codec->codec_id == AV_CODEC_ID_OTF
#endif
)
{
// id's reported from libdvdnav
switch(stream->codec)
{
- case CODEC_ID_AC3:
+ case AV_CODEC_ID_AC3:
stream->iPhysicalId = pStream->id - 128;
break;
- case CODEC_ID_DTS:
+ case AV_CODEC_ID_DTS:
stream->iPhysicalId = pStream->id - 136;
break;
- case CODEC_ID_MP2:
+ case AV_CODEC_ID_MP2:
stream->iPhysicalId = pStream->id - 448;
break;
- case CODEC_ID_PCM_S16BE:
+ case AV_CODEC_ID_PCM_S16BE:
stream->iPhysicalId = pStream->id - 160;
break;
- case CODEC_ID_DVD_SUBTITLE:
+ case AV_CODEC_ID_DVD_SUBTITLE:
stream->iPhysicalId = pStream->id - 0x20;
break;
default:
#ifdef FF_PROFILE_DTS_HD_MA
/* use profile to determine the DTS type */
- if (stream->codec == CODEC_ID_DTS)
+ if (stream->codec == AV_CODEC_ID_DTS)
{
if (stream->profile == FF_PROFILE_DTS_HD_MA)
strName = "dtshd_ma";
if(!strcmp(type, "AC3")) {
st.a = new CDemuxStreamAudioHTSP(this, type);
- st.a->codec = CODEC_ID_AC3;
+ st.a->codec = AV_CODEC_ID_AC3;
} else if(!strcmp(type, "EAC3")) {
st.a = new CDemuxStreamAudioHTSP(this, type);
- st.a->codec = CODEC_ID_EAC3;
+ st.a->codec = AV_CODEC_ID_EAC3;
} else if(!strcmp(type, "MPEG2AUDIO")) {
st.a = new CDemuxStreamAudioHTSP(this, type);
- st.a->codec = CODEC_ID_MP2;
+ st.a->codec = AV_CODEC_ID_MP2;
} else if(!strcmp(type, "AAC")) {
st.a = new CDemuxStreamAudioHTSP(this, type);
- st.a->codec = CODEC_ID_AAC;
+ st.a->codec = AV_CODEC_ID_AAC;
} else if(!strcmp(type, "MPEG2VIDEO")) {
st.v = new CDemuxStreamVideoHTSP(this, type);
- st.v->codec = CODEC_ID_MPEG2VIDEO;
+ st.v->codec = AV_CODEC_ID_MPEG2VIDEO;
st.v->iWidth = htsmsg_get_u32_or_default(sub, "width" , 0);
st.v->iHeight = htsmsg_get_u32_or_default(sub, "height", 0);
} else if(!strcmp(type, "H264")) {
st.v = new CDemuxStreamVideoHTSP(this, type);
- st.v->codec = CODEC_ID_H264;
+ st.v->codec = AV_CODEC_ID_H264;
st.v->iWidth = htsmsg_get_u32_or_default(sub, "width" , 0);
st.v->iHeight = htsmsg_get_u32_or_default(sub, "height", 0);
} else if(!strcmp(type, "DVBSUB")) {
st.s = new CDemuxStreamSubtitle();
- st.s->codec = CODEC_ID_DVB_SUBTITLE;
+ st.s->codec = AV_CODEC_ID_DVB_SUBTITLE;
uint32_t composition_id = 0, ancillary_id = 0;
htsmsg_get_u32(sub, "composition_id", &composition_id);
htsmsg_get_u32(sub, "ancillary_id" , &ancillary_id);
}
} else if(!strcmp(type, "TEXTSUB")) {
st.s = new CDemuxStreamSubtitle();
- st.s->codec = CODEC_ID_TEXT;
+ st.s->codec = AV_CODEC_ID_TEXT;
} else if(!strcmp(type, "TELETEXT")) {
st.t = new CDemuxStreamTeletext();
- st.t->codec = CODEC_ID_DVB_TELETEXT;
+ st.t->codec = AV_CODEC_ID_DVB_TELETEXT;
} else {
continue;
}
{
switch (codec)
{
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
strInfo = "mpeg2video";
break;
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
strInfo = "h264";
break;
default:
{
switch (codec)
{
- case CODEC_ID_AC3:
+ case AV_CODEC_ID_AC3:
strInfo = "ac3";
break;
- case CODEC_ID_EAC3:
+ case AV_CODEC_ID_EAC3:
strInfo = "eac3";
break;
- case CODEC_ID_MP2:
+ case AV_CODEC_ID_MP2:
strInfo = "mpeg2audio";
break;
- case CODEC_ID_AAC:
+ case AV_CODEC_ID_AAC:
strInfo = "aac";
break;
- case CODEC_ID_DTS:
+ case AV_CODEC_ID_DTS:
strInfo = "dts";
break;
default:
{
st = dynamic_cast<CDemuxStreamAudioPVRClient*>(stm);
if (!st
- || (st->codec != (CodecID)props.stream[i].iCodecId)
+ || (st->codec != (AVCodecID)props.stream[i].iCodecId)
|| (st->iChannels != props.stream[i].iChannels))
DisposeStream(i);
}
{
st = dynamic_cast<CDemuxStreamVideoPVRClient*>(stm);
if (!st
- || (st->codec != (CodecID)props.stream[i].iCodecId)
+ || (st->codec != (AVCodecID)props.stream[i].iCodecId)
|| (st->iWidth != props.stream[i].iWidth)
|| (st->iHeight != props.stream[i].iHeight))
DisposeStream(i);
m_streams[i] = st;
st->m_parser_split = true;
}
- else if (props.stream[i].iCodecId == CODEC_ID_DVB_TELETEXT)
+ else if (props.stream[i].iCodecId == AV_CODEC_ID_DVB_TELETEXT)
{
if (stm)
{
- if (stm->codec != (CodecID)props.stream[i].iCodecId)
+ if (stm->codec != (AVCodecID)props.stream[i].iCodecId)
DisposeStream(i);
}
if (!m_streams[i])
if (stm)
{
st = dynamic_cast<CDemuxStreamSubtitlePVRClient*>(stm);
- if (!st || (st->codec != (CodecID)props.stream[i].iCodecId))
+ if (!st || (st->codec != (AVCodecID)props.stream[i].iCodecId))
DisposeStream(i);
}
if (!m_streams[i])
m_streams[i] = new CDemuxStream();
}
- m_streams[i]->codec = (CodecID)props.stream[i].iCodecId;
+ m_streams[i]->codec = (AVCodecID)props.stream[i].iCodecId;
m_streams[i]->iId = i;
m_streams[i]->iPhysicalId = props.stream[i].iPhysicalId;
m_streams[i]->language[0] = props.stream[i].strLanguage[0];
CDemuxStream *stream = GetStream(iStreamId);
if (stream)
{
- if (stream->codec == CODEC_ID_AC3)
+ if (stream->codec == AV_CODEC_ID_AC3)
strName = "ac3";
- else if (stream->codec == CODEC_ID_MP2)
+ else if (stream->codec == AV_CODEC_ID_MP2)
strName = "mp2";
- else if (stream->codec == CODEC_ID_AAC)
+ else if (stream->codec == AV_CODEC_ID_AAC)
strName = "aac";
- else if (stream->codec == CODEC_ID_DTS)
+ else if (stream->codec == AV_CODEC_ID_DTS)
strName = "dca";
- else if (stream->codec == CODEC_ID_MPEG2VIDEO)
+ else if (stream->codec == AV_CODEC_ID_MPEG2VIDEO)
strName = "mpeg2video";
- else if (stream->codec == CODEC_ID_H264)
+ else if (stream->codec == AV_CODEC_ID_H264)
strName = "h264";
- else if (stream->codec == CODEC_ID_EAC3)
+ else if (stream->codec == AV_CODEC_ID_EAC3)
strName = "eac3";
}
}
stricmp(strMimeType.c_str(), CONTENT_TYPE_AACPLUS) == 0)
{
// need an aac decoder first
- m_pDemuxStream->codec = CODEC_ID_AAC;
+ m_pDemuxStream->codec = AV_CODEC_ID_AAC;
}
else // (stricmp(strMimeType, CONTENT_TYPE_MP3) == 0)
{
// default to mp3
- m_pDemuxStream->codec = CODEC_ID_MP3;
+ m_pDemuxStream->codec = AV_CODEC_ID_MP3;
}
return true;
CDVDStreamInfo hints;
CDVDCodecOptions options;
- hints.codec = CODEC_ID_DVD_SUBTITLE;
+ hints.codec = AV_CODEC_ID_DVD_SUBTITLE;
char line[2048];
DECLARE_UNUSED(bool,res)
else
stream->iPhysicalId = -1;
- stream->codec = CODEC_ID_DVD_SUBTITLE;
+ stream->codec = AV_CODEC_ID_DVD_SUBTITLE;
stream->iId = m_Streams.size();
state.id = stream->iId;
CDVDStreamInfo hint(*pDemuxer->GetStream(nVideoStream), true);
hint.software = true;
- if (hint.codec == CODEC_ID_MPEG2VIDEO || hint.codec == CODEC_ID_MPEG1VIDEO)
+ if (hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO)
{
// libmpeg2 is not thread safe so use ffmepg for mpeg2/mpeg1 thumb extraction
CDVDCodecOptions dvdOptions;
}
}
}
- else if (m_streaminfo.codec == CODEC_ID_DVD_SUBTITLE)
+ else if (m_streaminfo.codec == AV_CODEC_ID_DVD_SUBTITLE)
{
CDVDOverlaySpu* pSPUInfo = m_dvdspus.AddData(pPacket->pData, pPacket->iSize, pPacket->pts);
if (pSPUInfo)
}
// dvd's use special subtitle decoder
- if(hints.codec == CODEC_ID_DVD_SUBTITLE && filename == "dvd")
+ if(hints.codec == AV_CODEC_ID_DVD_SUBTITLE && filename == "dvd")
return true;
m_pOverlayCodec = CDVDFactoryCodec::CreateOverlayCodec(hints);
bool CDVDTeletextData::CheckStream(CDVDStreamInfo &hints)
{
- if (hints.codec == CODEC_ID_DVB_TELETEXT)
+ if (hints.codec == AV_CODEC_ID_DVB_TELETEXT)
return true;
return false;
{
m_messageQueue.Init();
- if (hints.codec == CODEC_ID_DVB_TELETEXT)
+ if (hints.codec == AV_CODEC_ID_DVB_TELETEXT)
{
CLog::Log(LOGNOTICE, "Creating teletext data thread");
Create();
#include "cores/VideoRenderers/RenderManager.h"
#endif
-enum CodecID;
class CDemuxStreamVideo;
class CDVDOverlayCodecCC;
void CDVDStreamInfo::Clear()
{
- codec = CODEC_ID_NONE;
+ codec = AV_CODEC_ID_NONE;
type = STREAM_NONE;
software = false;
codec_tag = 0;
void Assign(const CDVDStreamInfo &right, bool withextradata);
void Assign(const CDemuxStream &right, bool withextradata);
- CodecID codec;
+ AVCodecID codec;
StreamType type;
bool software; //force software decoding
m_omx_clock (NULL ),
m_av_clock (NULL ),
m_settings_changed(false ),
+ m_setStartTime (false ),
m_LostSync (true ),
m_SampleRate (0 ),
m_eEncoding (OMX_AUDIO_CodingPCM),
m_extradata (NULL ),
m_extrasize (0 ),
- m_last_pts (DVD_NOPTS_VALUE)
+ m_last_pts (DVD_NOPTS_VALUE),
+ m_submitted_eos (false )
{
m_vizBufferSize = m_vizRemapBufferSize = VIS_PACKET_SIZE * sizeof(float);
m_vizRemapBuffer = (uint8_t *)_aligned_malloc(m_vizRemapBufferSize,16);
if(!m_omx_render.Initialize("OMX.broadcom.audio_render", OMX_IndexParamAudioInit))
return false;
+ if(!m_Passthrough)
+ {
+ /* setup mixer output */
+ OMX_INIT_STRUCTURE(m_pcm_output);
+ m_pcm_output.nPortIndex = m_omx_decoder.GetOutputPort();
+ omx_err = m_omx_decoder.GetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error SetParameter 1 output omx_err(0x%08x)", CLASSNAME, __func__, omx_err);
+ }
+ m_pcm_output.nPortIndex = m_omx_mixer.GetOutputPort();
+ omx_err = m_omx_mixer.SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error SetParameter 1 output omx_err(0x%08x)", CLASSNAME, __func__, omx_err);
+ }
+ CLog::Log(LOGDEBUG, "%s::%s - Output bps %d samplerate %d channels %d buffer size %d bytes per second %d",
+ CLASSNAME, __func__, (int)m_pcm_output.nBitPerSample, (int)m_pcm_output.nSamplingRate, (int)m_pcm_output.nChannels, m_BufferLen, m_BytesPerSec);
+ PrintPCM(&m_pcm_output, std::string("output"));
+ }
+
m_omx_tunnel_clock.Initialize(m_omx_clock, m_omx_clock->GetInputPort(), &m_omx_render, m_omx_render.GetInputPort()+1);
omx_err = m_omx_tunnel_clock.Establish(false);
m_omx_render.ResetEos();
+ // By default audio_render is the clock master, and if output samples don't fit the timestamps, it will speed up/slow down the clock.
+ // This tends to be better for maintaining audio sync and avoiding audio glitches, but can affect video/display sync
+ if(CSettings::Get().GetBool("videoplayer.usedisplayasclock"))
+ {
+ OMX_CONFIG_BOOLEANTYPE configBool;
+ OMX_INIT_STRUCTURE(configBool);
+ configBool.bEnabled = OMX_FALSE;
+
+ omx_err = m_omx_render.SetConfig(OMX_IndexConfigBrcmClockReferenceSource, &configBool);
+ if (omx_err != OMX_ErrorNone)
+ return false;
+ }
+
OMX_CONFIG_BRCMAUDIODESTINATIONTYPE audioDest;
OMX_INIT_STRUCTURE(audioDest);
strncpy((char *)audioDest.sName, m_deviceuse.c_str(), strlen(m_deviceuse.c_str()));
m_vizRemap.Initialize(m_format.m_channelLayout, CAEChannelInfo(AE_CH_LAYOUT_2_0), false, true);
}
- OMX_INIT_STRUCTURE(m_pcm_output);
OMX_INIT_STRUCTURE(m_pcm_input);
- memcpy(m_pcm_output.eChannelMapping, m_output_channels, sizeof(m_output_channels));
memcpy(m_pcm_input.eChannelMapping, m_input_channels, sizeof(m_input_channels));
- // set the m_pcm_output parameters
- m_pcm_output.eNumData = OMX_NumericalDataSigned;
- m_pcm_output.eEndian = OMX_EndianLittle;
- m_pcm_output.bInterleaved = OMX_TRUE;
- m_pcm_output.nBitPerSample = 16; // float is decoded to 16bit integer by gpu
- m_pcm_output.ePCMMode = OMX_AUDIO_PCMModeLinear;
- m_pcm_output.nChannels = m_OutputChannels;
- m_pcm_output.nSamplingRate = m_format.m_sampleRate;
-
m_SampleRate = m_format.m_sampleRate;
m_BitsPerSample = CAEUtil::DataFormatToBits(m_format.m_dataFormat);
- m_BufferLen = m_BytesPerSec = m_format.m_sampleRate *
- (m_BitsPerSample >> 3) * m_format.m_channelLayout.Count();
+ m_BufferLen = m_BytesPerSec = m_format.m_sampleRate * (16 >> 3) * m_format.m_channelLayout.Count();
m_BufferLen *= AUDIO_BUFFER_SECONDS;
// should be big enough that common formats (e.g. 6 channel DTS) fit in a single packet.
// we don't mind less common formats being split (e.g. ape/wma output large frames)
return false;
}
- // set up the number/size of buffers
+ // set up the number/size of buffers for decoder input
OMX_PARAM_PORTDEFINITIONTYPE port_param;
OMX_INIT_STRUCTURE(port_param);
port_param.nPortIndex = m_omx_decoder.GetInputPort();
omx_err = m_omx_decoder.GetParameter(OMX_IndexParamPortDefinition, &port_param);
if(omx_err != OMX_ErrorNone)
{
- CLog::Log(LOGERROR, "COMXAudio::Initialize error get OMX_IndexParamPortDefinition omx_err(0x%08x)\n", omx_err);
+ CLog::Log(LOGERROR, "COMXAudio::Initialize error get OMX_IndexParamPortDefinition (input) omx_err(0x%08x)\n", omx_err);
return false;
}
port_param.format.audio.eEncoding = m_eEncoding;
port_param.nBufferSize = m_ChunkLen;
- port_param.nBufferCountActual = m_BufferLen / m_ChunkLen;
+ port_param.nBufferCountActual = std::max(port_param.nBufferCountMin, 6U);
omx_err = m_omx_decoder.SetParameter(OMX_IndexParamPortDefinition, &port_param);
if(omx_err != OMX_ErrorNone)
return false;
}
- //port_param.nBufferCountActual = std::max(1, (int)(m_BufferLen / port_param.nBufferSize));
+ port_param.nBufferCountActual = std::max(port_param.nBufferCountMin, m_BufferLen / port_param.nBufferSize);
omx_err = m_omx_decoder.SetParameter(OMX_IndexParamPortDefinition, &port_param);
if(omx_err != OMX_ErrorNone)
m_Initialized = true;
m_settings_changed = false;
+ m_setStartTime = true;
+ m_submitted_eos = false;
m_last_pts = DVD_NOPTS_VALUE;
- CLog::Log(LOGDEBUG, "COMXAudio::Initialize Ouput bps %d samplerate %d channels %d buffer size %d bytes per second %d",
- (int)m_pcm_output.nBitPerSample, (int)m_pcm_output.nSamplingRate, (int)m_pcm_output.nChannels, m_BufferLen, m_BytesPerSec);
CLog::Log(LOGDEBUG, "COMXAudio::Initialize Input bps %d samplerate %d channels %d buffer size %d bytes per second %d",
(int)m_pcm_input.nBitPerSample, (int)m_pcm_input.nSamplingRate, (int)m_pcm_input.nChannels, m_BufferLen, m_BytesPerSec);
+ PrintPCM(&m_pcm_output, std::string("input"));
CLog::Log(LOGDEBUG, "COMXAudio::Initialize device %s passthrough %d hwdecode %d",
device.c_str(), m_Passthrough, m_HWDecode);
m_last_pts = DVD_NOPTS_VALUE;
m_LostSync = true;
+ m_setStartTime = true;
}
//***********************************************************************************************
uint64_t val = (uint64_t)(pts == DVD_NOPTS_VALUE) ? 0 : pts;
- if(m_av_clock->AudioStart())
+ if(m_setStartTime)
{
omx_buffer->nFlags = OMX_BUFFERFLAG_STARTTIME;
if(pts == DVD_NOPTS_VALUE)
m_last_pts = pts;
CLog::Log(LOGDEBUG, "COMXAudio::Decode ADec : setStartTime %f\n", (float)val / DVD_TIME_BASE);
- m_av_clock->AudioStart(false);
+ m_setStartTime = false;
}
else
{
if(!m_Initialized)
return;
+ m_submitted_eos = true;
+
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
OMX_BUFFERHEADERTYPE *omx_buffer = m_omx_decoder.GetInputBuffer();
CLog::Log(LOGERROR, "%s::%s - OMX_EmptyThisBuffer() failed with result(0x%x)\n", CLASSNAME, __func__, omx_err);
return;
}
+ CLog::Log(LOGINFO, "%s::%s", CLASSNAME, __func__);
}
bool COMXAudio::IsEOS()
return true;
unsigned int latency = GetAudioRenderingLatency();
CSingleLock lock (m_critSection);
- return m_omx_decoder.IsEOS() && latency <= 0;
+
+ if (!(m_omx_decoder.IsEOS() && latency == 0))
+ return false;
+
+ if (m_submitted_eos)
+ {
+ CLog::Log(LOGINFO, "%s::%s", CLASSNAME, __func__);
+ m_submitted_eos = false;
+ }
+ return true;
}
void COMXAudio::SwitchChannels(int iAudioStream, bool bAudioOnAllSpeakers)
}
}
-bool COMXAudio::CanHWDecode(CodecID codec)
+bool COMXAudio::CanHWDecode(AVCodecID codec)
{
bool ret = false;
switch(codec)
{
- case CODEC_ID_DTS:
+ case AV_CODEC_ID_DTS:
CLog::Log(LOGDEBUG, "COMXAudio::CanHWDecode OMX_AUDIO_CodingDTS\n");
ret = true;
break;
- case CODEC_ID_AC3:
- case CODEC_ID_EAC3:
+ case AV_CODEC_ID_AC3:
+ case AV_CODEC_ID_EAC3:
CLog::Log(LOGDEBUG, "COMXAudio::CanHWDecode OMX_AUDIO_CodingDDP\n");
ret = true;
break;
#include "threads/CriticalSection.h"
-#define AUDIO_BUFFER_SECONDS 2
+#define AUDIO_BUFFER_SECONDS 3
#define VIS_PACKET_SIZE 512
#define OMX_IS_RAW(x) \
void Process();
void SetCodingType(AEDataFormat dataFormat);
- static bool CanHWDecode(CodecID codec);
+ static bool CanHWDecode(AVCodecID codec);
static void PrintChannels(OMX_AUDIO_CHANNELTYPE eChannelMapping[]);
void PrintPCM(OMX_AUDIO_PARAM_PCMMODETYPE *pcm, std::string direction);
COMXCoreComponent *m_omx_clock;
OMXClock *m_av_clock;
bool m_settings_changed;
+ bool m_setStartTime;
bool m_LostSync;
int m_SampleRate;
OMX_AUDIO_CODINGTYPE m_eEncoding;
int m_vizRemapBufferSize;
uint8_t *m_vizRemapBuffer;
CAERemap m_vizRemap;
+ bool m_submitted_eos;
OMX_AUDIO_PARAM_PCMMODETYPE m_pcm_output;
OMX_AUDIO_PARAM_PCMMODETYPE m_pcm_input;
if(IsRunning())
CloseFile();
- if(!m_av_clock.OMXInitialize(&m_clock, false, false))
- {
- return false;
- }
- if(CSettings::Get().GetBool("videoplayer.adjustrefreshrate"))
- m_av_clock.HDMIClockSync();
-
m_bAbortRequest = false;
SetPlaySpeed(DVD_PLAYSPEED_NORMAL);
bool bOmxWaitVideo = false;
bool bOmxWaitAudio = false;
bool bOmxSentEOFs = false;
+ float m_threshold = 0.2f;
if (!OpenInputStream())
{
// allow renderer to switch to fullscreen if requested
m_omxPlayerVideo.EnableFullscreen(m_PlayerOptions.fullscreen);
+ if(!m_av_clock.OMXInitialize(&m_clock, false, false))
+ {
+ m_bAbortRequest = true;
+ return;
+ }
+ if(CSettings::Get().GetBool("videoplayer.adjustrefreshrate"))
+ m_av_clock.HDMIClockSync();
+ m_av_clock.OMXStateIdle();
+ m_av_clock.OMXStop();
+ m_av_clock.HasAudio(m_HasVideo);
+ m_av_clock.HasVideo(m_HasAudio);
+ m_av_clock.OMXPause();
+
OpenDefaultStreams();
// look for any EDL files
while (!m_bAbortRequest)
{
+ const bool m_Pause = m_playSpeed == DVD_PLAYSPEED_PAUSE;
+ const bool not_accepts_data = (!m_omxPlayerAudio.AcceptsData() && m_CurrentAudio.id >= 0) ||
+ (!m_omxPlayerVideo.AcceptsData() && m_CurrentVideo.id >= 0);
+ /* when the video/audio fifos are low, we pause clock, when high we resume */
+ double stamp = m_av_clock.OMXMediaTime();
+ double audio_pts = floor(m_omxPlayerAudio.GetCurrentPts());
+ double video_pts = floor(m_omxPlayerVideo.GetCurrentPts());
+
+ float audio_fifo = audio_pts / DVD_TIME_BASE - stamp * 1e-6;
+ float video_fifo = video_pts / DVD_TIME_BASE - stamp * 1e-6;
+ float threshold = 0.1f;
+ bool audio_fifo_low = false, video_fifo_low = false, audio_fifo_high = false, video_fifo_high = false;
+
#ifdef _DEBUG
- char response[80];
static unsigned count;
if ((count++ & 15) == 0)
{
- vc_gencmd(response, sizeof response, "render_bar 4 video_fifo %d %d %d %d",
- m_omxPlayerVideo.GetDecoderBufferSize()-m_omxPlayerVideo.GetDecoderFreeSpace(),
- 0 , 0, m_omxPlayerVideo.GetDecoderBufferSize());
- vc_gencmd(response, sizeof response, "render_bar 5 audio_fifo %d %d %d %d",
- (int)(100.0*m_omxPlayerAudio.GetDelay()), 0, 0, 100*AUDIO_BUFFER_SECONDS);
+ char response[80];
+ if (m_omxPlayerVideo.GetDecoderBufferSize() && m_omxPlayerAudio.GetCacheTotal())
+ vc_gencmd(response, sizeof response, "render_bar 4 video_fifo %d %d %d %d",
+ (int)(100.0*(m_omxPlayerVideo.GetDecoderBufferSize()-m_omxPlayerVideo.GetDecoderFreeSpace())/m_omxPlayerVideo.GetDecoderBufferSize()),
+ (int)(100.0*video_fifo/m_omxPlayerAudio.GetCacheTotal()),
+ 0, 100);
+ if (m_omxPlayerAudio.GetCacheTotal())
+ vc_gencmd(response, sizeof response, "render_bar 5 audio_fifo %d %d %d %d",
+ (int)(100.0*audio_fifo/m_omxPlayerAudio.GetCacheTotal()),
+ (int)(100.0*m_omxPlayerAudio.GetDelay()/m_omxPlayerAudio.GetCacheTotal()),
+ 0, 100);
vc_gencmd(response, sizeof response, "render_bar 6 video_queue %d %d %d %d",
m_omxPlayerVideo.GetLevel(), 0, 0, 100);
vc_gencmd(response, sizeof response, "render_bar 7 audio_queue %d %d %d %d",
m_omxPlayerAudio.GetLevel(), 0, 0, 100);
}
#endif
+ if (audio_pts != DVD_NOPTS_VALUE)
+ {
+ audio_fifo_low = m_HasAudio && audio_fifo < threshold;
+ audio_fifo_high = audio_pts != DVD_NOPTS_VALUE && audio_fifo >= m_threshold;
+ }
+ if (video_pts != DVD_NOPTS_VALUE)
+ {
+ video_fifo_low = m_HasVideo && video_fifo < threshold;
+ video_fifo_high = video_pts != DVD_NOPTS_VALUE && video_fifo >= m_threshold;
+ }
+ if (!m_HasAudio && m_HasVideo)
+ audio_fifo_high = true;
+ if (!m_HasVideo && m_HasAudio)
+ video_fifo_high = true;
+
+ #ifdef _DEBUG
+ CLog::Log(LOGDEBUG, "%s - M:%.6f-%.6f (A:%.6f V:%.6f) PEF:%d%d%d S:%.2f A:%.2f V:%.2f/T:%.2f (A:%d%d V:%d%d) A:%d%% V:%d%% (%.2f,%.2f)", __FUNCTION__,
+ stamp*1e-6, m_av_clock.OMXClockAdjustment()*1e-6, audio_pts*1e-6, video_pts*1e-6, m_av_clock.OMXIsPaused(), bOmxSentEOFs, not_accepts_data, m_playSpeed * (1.0f/DVD_PLAYSPEED_NORMAL),
+ audio_pts == DVD_NOPTS_VALUE ? 0.0:audio_fifo, video_pts == DVD_NOPTS_VALUE ? 0.0:video_fifo, m_threshold,
+ audio_fifo_low, audio_fifo_high, video_fifo_low, video_fifo_high,
+ m_omxPlayerAudio.GetLevel(), m_omxPlayerVideo.GetLevel(), m_omxPlayerAudio.GetDelay(), (float)m_omxPlayerAudio.GetCacheTotal());
+ #endif
+
+ if (not_accepts_data && (audio_fifo_low || video_fifo_low))
+ {
+ CLog::Log(LOGDEBUG, "%s - Flush! M:%.6f-%.6f (A:%.6f V:%.6f) PEF:%d%d%d S:%.2f A:%.2f V:%.2f/T:%.2f (A:%d%d V:%d%d) A:%d%% V:%d%% (%.2f,%.2f)", __FUNCTION__,
+ stamp*1e-6, m_av_clock.OMXClockAdjustment()*1e-6, audio_pts*1e-6, video_pts*1e-6, m_av_clock.OMXIsPaused(), bOmxSentEOFs, not_accepts_data, m_playSpeed * (1.0f/DVD_PLAYSPEED_NORMAL),
+ audio_pts == DVD_NOPTS_VALUE ? 0.0:audio_fifo, video_pts == DVD_NOPTS_VALUE ? 0.0:video_fifo, m_threshold,
+ audio_fifo_low, audio_fifo_high, video_fifo_low, video_fifo_high,
+ m_omxPlayerAudio.GetLevel(), m_omxPlayerVideo.GetLevel(), m_omxPlayerAudio.GetDelay(), (float)m_omxPlayerAudio.GetCacheTotal());
+ FlushBuffers(false);
+ }
+ else if(!m_Pause && (bOmxSentEOFs || not_accepts_data || (audio_fifo_high && video_fifo_high)))
+ {
+ if (m_av_clock.OMXIsPaused())
+ {
+ CLog::Log(LOGDEBUG, "Resume %.2f,%.2f (A:%d%d V:%d%d) EOF:%d FULL:%d T:%.2f\n", audio_fifo, video_fifo,
+ audio_fifo_low, audio_fifo_high, video_fifo_low, video_fifo_high, bOmxSentEOFs, not_accepts_data, m_threshold);
+ m_av_clock.OMXStateExecute();
+ m_av_clock.OMXResume();
+ }
+ }
+ else if (m_Pause || audio_fifo_low || video_fifo_low)
+ {
+ if (!m_av_clock.OMXIsPaused())
+ {
+ if (!m_Pause)
+ m_threshold = std::min(2.0f*m_threshold, 16.0f);
+ CLog::Log(LOGDEBUG, "Pause %.2f,%.2f (A:%d%d V:%d%d) EOF:%d FULL:%d T:%.2f\n", audio_fifo, video_fifo,
+ audio_fifo_low, audio_fifo_high, video_fifo_low, video_fifo_high, bOmxSentEOFs, not_accepts_data, m_threshold);
+ m_av_clock.OMXPause();
+ }
+ }
+
// handle messages send to this thread, like seek or demuxer reset requests
HandleMessages();
if(m_change_volume && m_CurrentAudio.started)
{
- m_omxPlayerAudio.SetCurrentVolume(m_current_mute ? VOLUME_MINIMUM : m_current_volume);
- m_change_volume = false;
+ if(m_omxPlayerAudio.SetCurrentVolume(m_current_mute ? VOLUME_MINIMUM : m_current_volume))
+ m_change_volume = false;
}
// process the packet
m_CurrentAudio.started = true;
if(player == DVDPLAYER_VIDEO)
m_CurrentVideo.started = true;
+
+ if ((player == DVDPLAYER_AUDIO || player == DVDPLAYER_VIDEO) && (!m_HasAudio || m_CurrentAudio.started) && (!m_HasVideo || m_CurrentVideo.started))
+ {
+ m_av_clock.HasAudio(m_HasAudio);
+ m_av_clock.HasVideo(m_HasVideo);
+ m_av_clock.OMXReset();
+ }
+
CLog::Log(LOGDEBUG, "COMXPlayer::HandleMessages - player started %d", player);
}
else if (pMsg->IsType(CDVDMsg::PLAYER_DISPLAYTIME))
CLog::Log(LOGNOTICE, "FlushBuffers: q:%d pts:%.0f a:%d", queued, pts, accurate);
+ m_av_clock.OMXStop();
+ m_av_clock.OMXPause();
+
if(accurate)
startpts = pts;
else
bool COMXPlayer::GetCurrentSubtitle(CStdString& strSubtitle)
{
- double pts = m_av_clock.OMXMediaTime(false);
+ double pts = m_av_clock.OMXMediaTime();
if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
return false;
#include "utils/TimeUtils.h"
#include "OMXPlayer.h"
+#include "linux/RBP.h"
#include <iostream>
#include <sstream>
m_speed = DVD_PLAYSPEED_NORMAL;
m_started = false;
m_stalled = false;
- m_audioClock = 0;
+ m_audioClock = DVD_NOPTS_VALUE;
m_buffer_empty = false;
m_nChannels = 0;
m_DecoderOpen = false;
m_bad_state = false;
m_hints_current.Clear();
- m_messageQueue.SetMaxDataSize(3 * 1024 * 1024);
+ bool small_mem = g_RBP.GetArmMem() < 256;
+ m_messageQueue.SetMaxDataSize((small_mem ? 3:6) * 1024 * 1024);
+
m_messageQueue.SetMaxTimeSize(8.0);
m_use_passthrough = false;
m_passthrough = false;
m_hints.bitspersample = 16;
m_speed = DVD_PLAYSPEED_NORMAL;
- m_audioClock = 0;
+ m_audioClock = DVD_NOPTS_VALUE;
m_hw_decode = false;
m_silence = false;
m_started = false;
m_hints.samplerate = m_pAudioCodec->GetSampleRate();
}
- /* only check bitrate changes on CODEC_ID_DTS, CODEC_ID_AC3, CODEC_ID_EAC3 */
- if(m_hints.codec != CODEC_ID_DTS && m_hints.codec != CODEC_ID_AC3 && m_hints.codec != CODEC_ID_EAC3)
+ /* only check bitrate changes on AV_CODEC_ID_DTS, AV_CODEC_ID_AC3, AV_CODEC_ID_EAC3 */
+ if(m_hints.codec != AV_CODEC_ID_DTS && m_hints.codec != AV_CODEC_ID_AC3 && m_hints.codec != AV_CODEC_ID_EAC3)
new_bitrate = old_bitrate = 0;
if(m_hints_current.codec != m_hints.codec ||
if(bDropPacket)
m_stalled = false;
- if(m_omxAudio.GetCacheTime() < 0.1 /*&& min(99,m_messageQueue.GetLevel() + MathUtils::round_int(100.0/8.0*GetCacheTime())) > 10*/)
- {
- m_stalled = true;
- if(!m_av_clock->OMXAudioBuffer() && m_av_clock->HasVideo() && m_speed == DVD_PLAYSPEED_NORMAL)
- {
- clock_gettime(CLOCK_REALTIME, &m_starttime);
- m_av_clock->OMXAudioBufferStart();
- }
- }
-
// signal to our parent that we have initialized
if(m_started == false)
{
#endif
if(Decode(pPacket, m_speed > DVD_PLAYSPEED_NORMAL || m_speed < 0 || bPacketDrop))
{
- if (m_stalled && (m_omxAudio.GetCacheTime() > (AUDIO_BUFFER_SECONDS * 0.75f)))
+ // we are not running until something is cached in output device
+ if(m_stalled && m_omxAudio.GetCacheTime() > 0.0)
{
CLog::Log(LOGINFO, "COMXPlayerAudio - Switching to normal playback");
m_stalled = false;
- if(m_av_clock->HasVideo() && m_av_clock->OMXAudioBuffer())
- m_av_clock->OMXAudioBufferStop();
}
}
- // hard unlock audio out buffering
- clock_gettime(CLOCK_REALTIME, &m_endtime);
- //int iLevel = min(99,m_messageQueue.GetLevel() + MathUtils::round_int(100.0/8.0*GetCacheTime()));
- if(/*iLevel < 10 &&*/ m_stalled && m_av_clock->OMXAudioBuffer() && (m_endtime.tv_sec - m_starttime.tv_sec) > 1)
- {
- m_stalled = false;
- if(m_av_clock->HasVideo() && m_av_clock->OMXAudioBuffer())
- m_av_clock->OMXAudioBufferStop();
- }
}
else if (pMsg->IsType(CDVDMsg::GENERAL_SYNCHRONIZE))
{
CDVDMsgGeneralResync* pMsgGeneralResync = (CDVDMsgGeneralResync*)pMsg;
CLog::Log(LOGDEBUG, "COMXPlayerAudio - CDVDMsg::GENERAL_RESYNC(%f, %d)", m_audioClock, pMsgGeneralResync->m_clock);
m_flush = false;
+ m_audioClock = DVD_NOPTS_VALUE;
}
else if (pMsg->IsType(CDVDMsg::GENERAL_RESET))
{
CLog::Log(LOGDEBUG, "COMXPlayerAudio - CDVDMsg::GENERAL_RESET");
if (m_pAudioCodec)
m_pAudioCodec->Reset();
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
m_omxAudio.Flush();
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
m_started = false;
+ m_audioClock = DVD_NOPTS_VALUE;
}
else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH))
{
CLog::Log(LOGDEBUG, "COMXPlayerAudio - CDVDMsg::GENERAL_FLUSH");
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
m_omxAudio.Flush();
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
m_stalled = true;
m_started = false;
if (m_pAudioCodec)
m_pAudioCodec->Reset();
+ m_audioClock = DVD_NOPTS_VALUE;
}
else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED))
{
COMXPlayer::SPlayerState& state = ((CDVDMsgType<COMXPlayer::SPlayerState>*)pMsg)->m_value;
if(state.time_src == COMXPlayer::ETIMESOURCE_CLOCK)
- state.time = DVD_TIME_TO_MSEC(m_av_clock->OMXMediaTime(true));
+ state.time = DVD_TIME_TO_MSEC(m_av_clock->OMXMediaTime());
//state.time = DVD_TIME_TO_MSEC(m_av_clock->GetClock(state.timestamp) + state.time_offset);
else
state.timestamp = m_av_clock->GetAbsoluteClock();
}
else if (pMsg->IsType(CDVDMsg::GENERAL_DELAY))
{
- if (m_speed != DVD_PLAYSPEED_PAUSE)
- {
- double timeout = static_cast<CDVDMsgDouble*>(pMsg)->m_value;
-
- CLog::Log(LOGDEBUG, "COMXPlayerAudio - CDVDMsg::GENERAL_DELAY(%f)", timeout);
-
- timeout *= (double)DVD_PLAYSPEED_NORMAL / abs(m_speed);
- timeout += m_av_clock->GetAbsoluteClock();
-
- while(!m_bStop && m_av_clock->GetAbsoluteClock() < timeout)
- Sleep(1);
- }
+ double timeout = static_cast<CDVDMsgDouble*>(pMsg)->m_value;
+ CLog::Log(LOGDEBUG, "COMXPlayerAudio - CDVDMsg::GENERAL_DELAY(%f)", timeout);
}
else if (pMsg->IsType(CDVDMsg::PLAYER_SETSPEED))
{
/* pathrought is overriding hw decode*/
if(AUDIO_IS_BITSTREAM(CSettings::Get().GetInt("audiooutput.mode")) && m_use_passthrough)
{
- if(hints.codec == CODEC_ID_AC3 && CSettings::Get().GetBool("audiooutput.ac3passthrough") && hdmi_passthrough_ac3)
+ if(hints.codec == AV_CODEC_ID_AC3 && CSettings::Get().GetBool("audiooutput.ac3passthrough") && hdmi_passthrough_ac3)
{
dataFormat = AE_FMT_AC3;
m_passthrough = true;
}
- if(hints.codec == CODEC_ID_DTS && CSettings::Get().GetBool("audiooutput.dtspassthrough") && hdmi_passthrough_dts)
+ if(hints.codec == AV_CODEC_ID_DTS && CSettings::Get().GetBool("audiooutput.dtspassthrough") && hdmi_passthrough_dts)
{
dataFormat = AE_FMT_DTS;
m_passthrough = true;
/* hw decode */
if(m_use_hw_decode && !m_passthrough)
{
- if(hints.codec == CODEC_ID_AC3 && COMXAudio::CanHWDecode(m_hints.codec))
+ if(hints.codec == AV_CODEC_ID_AC3 && COMXAudio::CanHWDecode(m_hints.codec))
{
dataFormat = AE_FMT_AC3;
m_hw_decode = true;
}
- if(hints.codec == CODEC_ID_DTS && COMXAudio::CanHWDecode(m_hints.codec))
+ if(hints.codec == AV_CODEC_ID_DTS && COMXAudio::CanHWDecode(m_hints.codec))
{
dataFormat = AE_FMT_DTS;
m_hw_decode = true;
m_passthrough = false;
m_hw_decode = false;
- bool bSendParent = false;
-
if(m_DecoderOpen)
{
WaitCompletion();
m_omxAudio.Deinitialize();
m_DecoderOpen = false;
- bSendParent = true;
}
/* setup audi format for audio render */
else
device = "local";
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
-
bool bAudioRenderOpen = m_omxAudio.Initialize(m_format, device, m_av_clock, m_hints, m_passthrough, m_hw_decode);
m_codec_name = "";
m_codec_name.c_str(), m_nChannels, m_hints.samplerate, m_hints.bitspersample);
}
- m_av_clock->OMXStateExecute(false);
- m_av_clock->HasAudio(bAudioRenderOpen);
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
-
m_started = false;
- // TODO : Send FLUSH to parent, only if we had a valid open codec.
- // this is just a workaround to get the omx video decoder happy again
- // This situation happens, for example where we have in the stream an audio codec change
- if(bSendParent)
- m_messageParent.Put(new CDVDMsg(CDVDMsg::GENERAL_FLUSH));
-
return bAudioRenderOpen;
}
void OMXPlayerAudio::CloseDecoder()
{
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
m_omxAudio.Deinitialize();
- m_av_clock->HasAudio(false);
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
-
m_DecoderOpen = false;
}
m_omxAudio.UnRegisterAudioCallback();
}
-void OMXPlayerAudio::SetCurrentVolume(float fVolume)
+bool OMXPlayerAudio::SetCurrentVolume(float fVolume)
{
- m_omxAudio.SetCurrentVolume(fVolume);
+ return m_omxAudio.SetCurrentVolume(fVolume);
}
void OMXPlayerAudio::SetSpeed(int speed)
BitstreamStats m_audioStats;
- struct timespec m_starttime, m_endtime;
bool m_buffer_empty;
bool m_flush;
int m_nChannels;
void SubmitEOS();
void RegisterAudioCallback(IAudioCallback* pCallback);
void UnRegisterAudioCallback();
- void SetCurrentVolume(float fVolume);
+ bool SetCurrentVolume(float fVolume);
void SetSpeed(int iSpeed);
int GetAudioBitrate();
std::string GetPlayerInfo();
#include "guilib/GraphicContext.h"
#include "OMXPlayer.h"
+#include "linux/RBP.h"
class COMXMsgVideoCodecChange : public CDVDMsg
{
m_iCurrentPts = DVD_NOPTS_VALUE;
m_iVideoDelay = 0;
m_fForcedAspectRatio = 0.0f;
- m_messageQueue.SetMaxDataSize(10 * 1024 * 1024);
+ bool small_mem = g_RBP.GetArmMem() < 256;
+ m_messageQueue.SetMaxDataSize((small_mem ? 10:40) * 1024 * 1024);
m_messageQueue.SetMaxTimeSize(8.0);
m_dst_rect.SetRect(0, 0, 0, 0);
- m_nextOverlay = DVD_NOPTS_VALUE;
m_started = false;
+ m_iCurrentPts = DVD_NOPTS_VALUE;
+ m_nextOverlay = DVD_NOPTS_VALUE;
m_flush = false;
m_view_mode = 0;
+ m_history_valid_pts = 0;
}
OMXPlayerVideo::~OMXPlayerVideo()
}
m_open = true;
+ m_iCurrentPts = DVD_NOPTS_VALUE;
+ m_nextOverlay = DVD_NOPTS_VALUE;
return true;
}
m_speed = DVD_PLAYSPEED_NORMAL;
m_started = false;
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
m_omxVideo.Close();
- m_av_clock->HasVideo(false);
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
if(m_DllBcmHost.IsLoaded())
m_DllBcmHost.Unload();
void OMXPlayerVideo::OnStartup()
{
- m_iCurrentPts = DVD_NOPTS_VALUE;
- m_nextOverlay = DVD_NOPTS_VALUE;
}
void OMXPlayerVideo::OnExit()
return;
}
- m_iCurrentPts = pts;
-
if (CThread::m_bStop)
return;
// we aim to submit subtitles 100ms early
const double preroll = DVD_MSEC_TO_TIME(100);
- double media_pts = m_av_clock->OMXMediaTime(false);
+ double media_pts = m_av_clock->OMXMediaTime();
if (m_nextOverlay != DVD_NOPTS_VALUE && media_pts + preroll <= m_nextOverlay)
return;
g_renderManager.FlipPage(CThread::m_bStop, time/DVD_TIME_BASE);
}
+static unsigned count_bits(int32_t value)
+{
+ unsigned bits = 0;
+ for(;value;++bits)
+ value &= value - 1;
+ return bits;
+}
+
void OMXPlayerVideo::Process()
{
- double pts = 0;
double frametime = (double)DVD_TIME_BASE / m_fFrameRate;
bool bRequestDrop = false;
else if (pMsg->IsType(CDVDMsg::GENERAL_RESYNC))
{
CDVDMsgGeneralResync* pMsgGeneralResync = (CDVDMsgGeneralResync*)pMsg;
-
- if(pMsgGeneralResync->m_timestamp != DVD_NOPTS_VALUE)
- pts = pMsgGeneralResync->m_timestamp;
-
- CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_RESYNC(%f, %d)", pts, pMsgGeneralResync->m_clock);
+ CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_RESYNC(%f, %d)", pMsgGeneralResync->m_timestamp, pMsgGeneralResync->m_clock);
+ m_nextOverlay = DVD_NOPTS_VALUE;
+ m_iCurrentPts = DVD_NOPTS_VALUE;
pMsgGeneralResync->Release();
continue;
}
else if (pMsg->IsType(CDVDMsg::GENERAL_DELAY))
{
- if (m_speed != DVD_PLAYSPEED_PAUSE)
- {
- double timeout = static_cast<CDVDMsgDouble*>(pMsg)->m_value;
-
- CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_DELAY(%f)", timeout);
-
- timeout *= (double)DVD_PLAYSPEED_NORMAL / abs(m_speed);
- timeout += m_av_clock->GetAbsoluteClock();
-
- while(!m_bStop && m_av_clock->GetAbsoluteClock() < timeout)
- Sleep(1);
- }
+ double timeout = static_cast<CDVDMsgDouble*>(pMsg)->m_value;
+ CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_DELAY(%f)", timeout);
}
else if (pMsg->IsType(CDVDMsg::VIDEO_SET_ASPECT))
{
else if (pMsg->IsType(CDVDMsg::GENERAL_RESET))
{
CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_RESET");
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
m_omxVideo.Reset();
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
m_started = false;
m_nextOverlay = DVD_NOPTS_VALUE;
+ m_iCurrentPts = DVD_NOPTS_VALUE;
}
else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (COMXPlayerVideo::Flush())
{
m_stalled = true;
m_started = false;
m_nextOverlay = DVD_NOPTS_VALUE;
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
+ m_iCurrentPts = DVD_NOPTS_VALUE;
m_omxVideo.Reset();
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
m_flush = false;
}
else if (pMsg->IsType(CDVDMsg::PLAYER_SETSPEED))
COMXPlayer::SPlayerState& state = ((CDVDMsgType<COMXPlayer::SPlayerState>*)pMsg)->m_value;
if(state.time_src == COMXPlayer::ETIMESOURCE_CLOCK)
- state.time = DVD_TIME_TO_MSEC(m_av_clock->OMXMediaTime(true));
+ state.time = DVD_TIME_TO_MSEC(m_av_clock->OMXMediaTime());
//state.time = DVD_TIME_TO_MSEC(m_av_clock->GetClock(state.timestamp) + state.time_offset);
else
state.timestamp = m_av_clock->GetAbsoluteClock();
m_stalled = false;
}
- double output_pts = 0;
- // validate picture timing,
- // if both dts/pts invalid, use pts calulated from picture.iDuration
- // if pts invalid use dts, else use picture.pts as passed
- if (pPacket->dts == DVD_NOPTS_VALUE && pPacket->pts == DVD_NOPTS_VALUE)
- output_pts = pts;
- else if (pPacket->pts == DVD_NOPTS_VALUE)
- output_pts = pts;
- else
- output_pts = pPacket->pts;
-
- if(pPacket->pts != DVD_NOPTS_VALUE)
- pPacket->pts += m_iVideoDelay;
-
- if(pPacket->dts != DVD_NOPTS_VALUE)
- pPacket->dts += m_iVideoDelay;
+ // some packed bitstream AVI files set almost all pts values to DVD_NOPTS_VALUE, but have a scattering of real pts values.
+ // the valid pts values match the dts values.
+ // if a stream has had more than 4 valid pts values in the last 16, the use UNKNOWN, otherwise use dts
+ m_history_valid_pts = (m_history_valid_pts << 1) | (pPacket->pts != DVD_NOPTS_VALUE);
+ double pts = pPacket->pts;
+ if(pPacket->pts == DVD_NOPTS_VALUE && count_bits(m_history_valid_pts & 0xffff) < 4)
+ pts = pPacket->dts;
- if(pPacket->duration == 0)
- pPacket->duration = frametime;
+ if (pts != DVD_NOPTS_VALUE)
+ pts += m_iVideoDelay;
- if(output_pts != DVD_NOPTS_VALUE)
- pts = output_pts;
-
- m_omxVideo.Decode(pPacket->pData, pPacket->iSize, pPacket->dts, pPacket->pts);
-
- Output(output_pts, bRequestDrop);
+ m_omxVideo.Decode(pPacket->pData, pPacket->iSize, pts);
+ Output(pts, bRequestDrop);
+ m_iCurrentPts = pts;
if(m_started == false)
{
m_messageParent.Put(new CDVDMsgInt(CDVDMsg::PLAYER_STARTED, DVDPLAYER_VIDEO));
}
- // guess next frame pts. iDuration is always valid
- if (m_speed != 0)
- pts += pPacket->duration * m_speed / abs(m_speed);
-
break;
}
CLog::Log(LOGINFO, "OMXPlayerVideo::OpenDecoder : Invalid framerate %d, using forced 25fps and just trust timestamps\n", (int)m_fFrameRate);
m_fFrameRate = 25;
}
- // use aspect in stream always
- m_fForcedAspectRatio = m_hints.aspect;
-
-
- m_av_clock->Lock();
- m_av_clock->OMXStop(false);
+ // use aspect in stream if available
+ if (m_hints.forced_aspect)
+ m_fForcedAspectRatio = m_hints.aspect;
+ else
+ m_fForcedAspectRatio = 0.0;
bool bVideoDecoderOpen = m_omxVideo.Open(m_hints, m_av_clock, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, m_hdmi_clock_sync);
m_omxVideo.RegisterResolutionUpdateCallBack((void *)this, ResolutionUpdateCallBack);
m_av_clock->SetRefreshRate(m_fFrameRate);
}
- m_av_clock->OMXStateExecute(false);
- m_av_clock->HasVideo(bVideoDecoderOpen);
- m_av_clock->OMXReset(false);
- m_av_clock->UnLock();
+ // start from assuming all recent frames had valid pts
+ m_history_valid_pts = ~0;
return bVideoDecoderOpen;
}
player->SetVideoRect(SrcRect, DestRect);
}
-void OMXPlayerVideo::ResolutionUpdateCallBack(uint32_t width, uint32_t height)
+void OMXPlayerVideo::ResolutionUpdateCallBack(uint32_t width, uint32_t height, float display_aspect)
{
RESOLUTION res = g_graphicsContext.GetVideoResolution();
uint32_t video_width = CDisplaySettings::Get().GetResolutionInfo(res).iScreenWidth;
/* use forced aspect if any */
if( m_fForcedAspectRatio != 0.0f )
iDisplayWidth = (int) (iDisplayHeight * m_fForcedAspectRatio);
+ else if( display_aspect != 0.0f )
+ iDisplayWidth = (int) (iDisplayHeight * display_aspect);
CLog::Log(LOGDEBUG,"%s - change configuration. video:%dx%d. framerate: %4.2f. %dx%d format: BYPASS",
__FUNCTION__, video_width, video_height, m_fFrameRate, iDisplayWidth, iDisplayHeight);
g_renderManager.RegisterRenderUpdateCallBack((const void*)this, RenderUpdateCallBack);
}
-void OMXPlayerVideo::ResolutionUpdateCallBack(void *ctx, uint32_t width, uint32_t height)
+void OMXPlayerVideo::ResolutionUpdateCallBack(void *ctx, uint32_t width, uint32_t height, float display_aspect)
{
OMXPlayerVideo *player = static_cast<OMXPlayerVideo*>(ctx);
- player->ResolutionUpdateCallBack(width, height);
+ player->ResolutionUpdateCallBack(width, height, display_aspect);
}
CRect m_dst_rect;
int m_view_mode;
+ uint32_t m_history_valid_pts;
DllBcmHost m_DllBcmHost;
CDVDOverlayContainer *m_pOverlayContainer;
int GetFreeSpace();
void SetVideoRect(const CRect &SrcRect, const CRect &DestRect);
static void RenderUpdateCallBack(const void *ctx, const CRect &SrcRect, const CRect &DestRect);
- void ResolutionUpdateCallBack(uint32_t width, uint32_t height);
- static void ResolutionUpdateCallBack(void *ctx, uint32_t width, uint32_t height);
+ void ResolutionUpdateCallBack(uint32_t width, uint32_t height, float pixel_aspect);
+ static void ResolutionUpdateCallBack(void *ctx, uint32_t width, uint32_t height, float pixel_aspect);
};
#endif
#include "settings/Settings.h"
#include "utils/BitstreamConverter.h"
+#include "linux/RBP.h"
+
#include <sys/time.h>
#include <inttypes.h>
m_res_ctx = NULL;
m_submitted_eos = false;
m_settings_changed = false;
+ m_setStartTime = false;
m_transform = OMX_DISPLAY_ROT0;
}
return true;
}
-bool COMXVideo::NaluFormatStartCodes(enum CodecID codec, uint8_t *in_extradata, int in_extrasize)
+bool COMXVideo::NaluFormatStartCodes(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize)
{
switch(codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
if (in_extrasize < 7 || in_extradata == NULL)
return true;
// valid avcC atom data always starts with the value 1 (version), otherwise annexb
{
CLog::Log(LOGERROR, "%s::%s - error m_omx_decoder.GetParameter(OMX_IndexParamPortDefinition) omx_err(0x%08x)", CLASSNAME, __func__, omx_err);
}
+
+ OMX_CONFIG_POINTTYPE pixel_aspect;
+ OMX_INIT_STRUCTURE(pixel_aspect);
+ pixel_aspect.nPortIndex = m_omx_decoder.GetOutputPort();
+ omx_err = m_omx_decoder.GetParameter(OMX_IndexParamBrcmPixelAspectRatio, &pixel_aspect);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - error m_omx_decoder.GetParameter(OMX_IndexParamBrcmPixelAspectRatio) omx_err(0x%08x)", CLASSNAME, __func__, omx_err);
+ }
+
// let OMXPlayerVideo know about resolution so it can inform RenderManager
if (m_res_callback)
- m_res_callback(m_res_ctx, port_image.format.video.nFrameWidth, port_image.format.video.nFrameHeight);
+ {
+ float display_aspect = 0.0f;
+ if (pixel_aspect.nX && pixel_aspect.nY)
+ display_aspect = (float)pixel_aspect.nX * port_image.format.video.nFrameWidth /
+ ((float)pixel_aspect.nY * port_image.format.video.nFrameHeight);
+ m_res_callback(m_res_ctx, port_image.format.video.nFrameWidth, port_image.format.video.nFrameHeight, display_aspect);
+ }
if (m_settings_changed)
{
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
std::string decoder_name;
m_settings_changed = false;
+ m_setStartTime = true;
m_res_ctx = NULL;
m_res_callback = NULL;
switch (hints.codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
{
switch(hints.profile)
{
}
}
break;
- case CODEC_ID_MPEG4:
+ case AV_CODEC_ID_MPEG4:
// (role name) video_decoder.mpeg4
// MPEG-4, DivX 4/5 and Xvid compatible
decoder_name = OMX_MPEG4_DECODER;
m_codingType = OMX_VIDEO_CodingMPEG4;
m_video_codec_name = "omx-mpeg4";
break;
- case CODEC_ID_MPEG1VIDEO:
- case CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
// (role name) video_decoder.mpeg2
// MPEG-2
decoder_name = OMX_MPEG2V_DECODER;
m_codingType = OMX_VIDEO_CodingMPEG2;
m_video_codec_name = "omx-mpeg2";
break;
- case CODEC_ID_H263:
+ case AV_CODEC_ID_H263:
// (role name) video_decoder.mpeg4
// MPEG-4, DivX 4/5 and Xvid compatible
decoder_name = OMX_MPEG4_DECODER;
m_codingType = OMX_VIDEO_CodingMPEG4;
m_video_codec_name = "omx-h263";
break;
- case CODEC_ID_VP6:
+ case AV_CODEC_ID_VP6:
// this form is encoded upside down
vflip = true;
// fall through
- case CODEC_ID_VP6F:
- case CODEC_ID_VP6A:
+ case AV_CODEC_ID_VP6F:
+ case AV_CODEC_ID_VP6A:
// (role name) video_decoder.vp6
// VP6
decoder_name = OMX_VP6_DECODER;
m_codingType = OMX_VIDEO_CodingVP6;
m_video_codec_name = "omx-vp6";
break;
- case CODEC_ID_VP8:
+ case AV_CODEC_ID_VP8:
// (role name) video_decoder.vp8
// VP8
decoder_name = OMX_VP8_DECODER;
m_codingType = OMX_VIDEO_CodingVP8;
m_video_codec_name = "omx-vp8";
break;
- case CODEC_ID_THEORA:
+ case AV_CODEC_ID_THEORA:
// (role name) video_decoder.theora
// theora
decoder_name = OMX_THEORA_DECODER;
m_codingType = OMX_VIDEO_CodingTheora;
m_video_codec_name = "omx-theora";
break;
- case CODEC_ID_MJPEG:
- case CODEC_ID_MJPEGB:
+ case AV_CODEC_ID_MJPEG:
+ case AV_CODEC_ID_MJPEGB:
// (role name) video_decoder.mjpg
// mjpg
decoder_name = OMX_MJPEG_DECODER;
m_codingType = OMX_VIDEO_CodingMJPEG;
m_video_codec_name = "omx-mjpeg";
break;
- case CODEC_ID_VC1:
- case CODEC_ID_WMV3:
+ case AV_CODEC_ID_VC1:
+ case AV_CODEC_ID_WMV3:
// (role name) video_decoder.vc1
// VC-1, WMV9
decoder_name = OMX_VC1_DECODER;
}
portParam.nPortIndex = m_omx_decoder.GetInputPort();
- portParam.nBufferCountActual = VIDEO_BUFFERS;
-
+ bool small_mem = g_RBP.GetArmMem() < 256;
+ portParam.nBufferCountActual = small_mem ? VIDEO_BUFFERS:2*VIDEO_BUFFERS;
portParam.format.video.nFrameWidth = m_decoded_width;
portParam.format.video.nFrameHeight = m_decoded_height;
return false;
}
+ // request portsettingschanged on aspect ratio change
+ OMX_CONFIG_REQUESTCALLBACKTYPE notifications;
+ OMX_INIT_STRUCTURE(notifications);
+ notifications.nPortIndex = m_omx_decoder.GetOutputPort();
+ notifications.nIndex = OMX_IndexParamBrcmPixelAspectRatio;
+ notifications.bEnable = OMX_TRUE;
+
+ omx_err = m_omx_decoder.SetParameter((OMX_INDEXTYPE)OMX_IndexConfigRequestCallback, ¬ifications);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXVideo::Open OMX_IndexConfigRequestCallback error (0%08x)\n", omx_err);
+ return false;
+ }
+
OMX_PARAM_BRCMVIDEODECODEERRORCONCEALMENTTYPE concanParam;
OMX_INIT_STRUCTURE(concanParam);
if(g_advancedSettings.m_omxDecodeStartWithValidFrame)
CLASSNAME, __func__, m_omx_decoder.GetComponent(), m_omx_decoder.GetInputPort(), m_omx_decoder.GetOutputPort(),
m_deinterlace_request, m_hdmi_clock_sync);
- // start from assuming all recent frames had valid pts
- m_history_valid_pts = ~0;
-
return true;
}
return m_omx_decoder.GetInputBufferSize();
}
-static unsigned count_bits(int32_t value)
-{
- unsigned bits = 0;
- for(;value;++bits)
- value &= value - 1;
- return bits;
-}
-
-int COMXVideo::Decode(uint8_t *pData, int iSize, double dts, double pts)
+int COMXVideo::Decode(uint8_t *pData, int iSize, double pts)
{
OMX_ERRORTYPE omx_err;
omx_buffer->nFlags = 0;
omx_buffer->nOffset = 0;
- // some packed bitstream AVI files set almost all pts values to DVD_NOPTS_VALUE, but have a scattering of real pts values.
- // the valid pts values match the dts values.
- // if a stream has had more than 4 valid pts values in the last 16, the use UNKNOWN, otherwise use dts
- m_history_valid_pts = (m_history_valid_pts << 1) | (pts != DVD_NOPTS_VALUE);
- if(pts == DVD_NOPTS_VALUE && count_bits(m_history_valid_pts & 0xffff) < 4)
- pts = dts;
-
- if(m_av_clock->VideoStart())
+
+ if(m_setStartTime)
{
- // only send dts on first frame to get nearly correct starttime
- if(pts == DVD_NOPTS_VALUE)
- pts = dts;
omx_buffer->nFlags |= OMX_BUFFERFLAG_STARTTIME;
CLog::Log(LOGDEBUG, "OMXVideo::Decode VDec : setStartTime %f\n", (pts == DVD_NOPTS_VALUE ? 0.0 : pts) / DVD_TIME_BASE);
- m_av_clock->VideoStart(false);
+ m_setStartTime = false;
}
if(pts == DVD_NOPTS_VALUE)
omx_buffer->nFlags |= OMX_BUFFERFLAG_TIME_UNKNOWN;
return false;
}
}
+ omx_err = m_omx_decoder.WaitForEvent(OMX_EventParamOrConfigChanged, 0);
+ if (omx_err == OMX_ErrorNone)
+ {
+ if(!PortSettingsChanged())
+ {
+ CLog::Log(LOGERROR, "%s::%s - error PortSettingsChanged (EventParamOrConfigChanged) omx_err(0x%08x)\n", CLASSNAME, __func__, omx_err);
+ }
+ }
}
return true;
if(!m_is_open)
return;
+ m_setStartTime = true;
m_omx_decoder.FlushInput();
m_omx_tunnel_decoder.Flush();
}
CLog::Log(LOGERROR, "%s::%s - OMX_EmptyThisBuffer() failed with result(0x%x)\n", CLASSNAME, __func__, omx_err);
return;
}
+ CLog::Log(LOGINFO, "%s::%s", CLASSNAME, __func__);
}
bool COMXVideo::IsEOS()
{
if(!m_is_open)
return true;
- return m_omx_render.IsEOS();
+ if (!m_omx_render.IsEOS())
+ return false;
+ if (m_submitted_eos)
+ {
+ CLog::Log(LOGINFO, "%s::%s", CLASSNAME, __func__);
+ m_submitted_eos = false;
+ }
+ return true;
}
#define CLASSNAME "COMXVideo"
-typedef void (*ResolutionUpdateCallBackFn)(void *ctx, uint32_t width, uint32_t height);
+typedef void (*ResolutionUpdateCallBackFn)(void *ctx, uint32_t width, uint32_t height, float display_aspect);
class COMXVideo
{
void Close(void);
unsigned int GetFreeSpace();
unsigned int GetSize();
- int Decode(uint8_t *pData, int iSize, double dts, double pts);
+ int Decode(uint8_t *pData, int iSize, double pts);
void Reset(void);
void SetDropState(bool bDrop);
std::string GetDecoderName() { return m_video_codec_name; };
COMXCoreTunel m_omx_tunnel_sched;
COMXCoreTunel m_omx_tunnel_image_fx;
bool m_is_open;
+ bool m_setStartTime;
uint8_t *m_extradata;
int m_extrasize;
bool m_deinterlace;
EDEINTERLACEMODE m_deinterlace_request;
bool m_hdmi_clock_sync;
- uint32_t m_history_valid_pts;
ResolutionUpdateCallBackFn m_res_callback;
void *m_res_ctx;
bool m_submitted_eos;
OMX_DISPLAYTRANSFORMTYPE m_transform;
bool m_settings_changed;
- static bool NaluFormatStartCodes(enum CodecID codec, uint8_t *in_extradata, int in_extrasize);
+ static bool NaluFormatStartCodes(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize);
};
#endif
}
catch(...)
{
- CLog::Log(LOGERROR, "%s: Exception thrown when opeing demuxer", __FUNCTION__);
+ CLog::Log(LOGERROR, "%s: Exception thrown when opening demuxer", __FUNCTION__);
if (m_pDemuxer)
{
delete m_pDemuxer;
#include "utils/StdString.h"
+// Reserved 0 - 255
+// XBIRRemote.h
+// XINPUT_IR_REMOTE-*
+
// Analogue - don't change order
#define KEY_BUTTON_A 256
#define KEY_BUTTON_B 257
#define XINPUT_IR_REMOTE_YELLOW 253
#define XINPUT_IR_REMOTE_BLUE 254
#define XINPUT_IR_REMOTE_PLAYLIST 255
-#define XINPUT_IR_REMOTE_GUIDE 256
+#define XINPUT_IR_REMOTE_GUIDE 50
#define XINPUT_IR_REMOTE_LIVE_RADIO 248
#define XINPUT_IR_REMOTE_EPG_SEARCH 246
+// Reserved 256 -> ...
+// Key.h
+// KEY_BUTTON_*
+
typedef struct _XINPUT_IR_REMOTE
{
BYTE wButtons;
class Keyboard : public AddonClass
{
public:
+#ifndef SWIG
String strDefault;
String strHeading;
bool bHidden;
String strText;
bool bConfirmed;
+#endif
Keyboard(const String& line = emptyString, const String& heading = emptyString, bool hidden = false);
virtual ~Keyboard();
class ListItem : public AddonClass
{
public:
+#ifndef SWIG
CFileItemPtr item;
+#endif
ListItem(const String& label = emptyString,
const String& label2 = emptyString,
(Pattern.compile('''(r.){0,1}XbmcCommons::Buffer''')) : new File('typemaps/python.buffer.intm'),
(Pattern.compile('''(p.){0,1}std::map<\\(.*\\)>''')) : new File('typemaps/python.map.intm'),
'bool' : '${api} = (PyInt_AsLong(${slarg}) == 0L ? false : true);',
- 'long' : '${api} = PyInt_AsLong(${slarg});'
+ 'long' : '${api} = PyInt_AsLong(${slarg});',
+ 'unsigned long' : '${api} = PyLong_AsUnsignedLong(${slarg});',
+ 'long long' : '${api} = PyLong_AsLongLong(${slarg});',
+ 'unsigned long long' : '${api} = PyLong_AsUnsignedLongLong(${slarg});',
+ 'int' : '${api} = (int)PyInt_AsLong(${slarg});',
+ 'double' : '${api} = PyFloat_AsDouble(${slarg});',
+ 'float' : '${api} = (float)PyFloat_AsDouble(${slarg});'
], '${api} = (${swigTypeParser.SwigType_str(ltype)})retrieveApiInstance(${slarg},"${ltype}","${helper.findNamespace(method)}","${helper.callingName(method)}");')
//println 'this: ' + this.binding.getVariables()
List normalMethods = clazz.function.findAll { !it.@name.startsWith("operator ") }
List operators = clazz.function.findAll { it.@name.startsWith("operator ") }
+ List properties = clazz.variable.findAll { it.@access != null && it.@access == "public" }
+ List properties_set = properties.findAll { it.@feature_immutable == null || it.@feature_immutable == 0 }
operators.each {
// we have an operator. The only one we can handle is ==
{NULL, NULL, 0, NULL}
};
+<%
+ if (properties.size() > 0) {
+%> static PyObject* ${classNameAsVariable}_getMember(PyHolder *self, void *name)
+ {
+ if (self == NULL)
+ return NULL;
+<%
+ String clazzName = Helper.findFullClassName(properties[0])
+%>
+ try
+ {
+ ${clazzName}* theObj = (${clazzName}*)retrieveApiInstance((PyObject*)self, &Py${classNameAsVariable}_Type, "${classNameAsVariable}_getMember()", "${clazzName}");
+
+ PyObject* result = NULL;
+ <%
+ properties.each {
+%> if (strcmp((char*)name, "${it.@sym_name}") == 0)
+ {
+ ${SwigTypeParser.SwigType_lstr(it.@type)} apiResult = (${SwigTypeParser.SwigType_lstr(it.@type)})theObj->${it.@sym_name};
+ ${Helper.getOutConversion(it.@type, 'result', it)}
+ }
+ else<%
+ } %>
+ {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ return result;
+ }
+ catch (const XBMCAddon::WrongTypeException& e)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: %s",e.GetMessage());
+ PyErr_SetString(PyExc_TypeError, e.GetMessage());
+ return NULL;
+ }
+ catch (const XbmcCommons::Exception& e)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: %s",e.GetMessage());
+ PyErr_SetString(PyExc_RuntimeError, e.GetMessage());
+ return NULL;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: Unknown exception thrown from the call \"${classNameAsVariable}_getMember()\"");
+ PyErr_SetString(PyExc_RuntimeError, "Unknown exception thrown from the call \"${classNameAsVariable}_getMember()\"");
+ return NULL;
+ }
+
+ return NULL;
+ }
+
+<%
+ if (properties_set.size() > 0) {
+%> int ${classNameAsVariable}_setMember(PyHolder *self, PyObject *value, void *name)
+ {
+ if (self == NULL)
+ return -1;
+
+ ${clazzName}* theObj = NULL;
+ try
+ {
+ theObj = (${clazzName}*)retrieveApiInstance((PyObject*)self, &Py${classNameAsVariable}_Type, "${classNameAsVariable}_getMember()", "${clazzName}");
+ }
+ catch (const XBMCAddon::WrongTypeException& e)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: %s",e.GetMessage());
+ PyErr_SetString(PyExc_TypeError, e.GetMessage());
+ return NULL;
+ }
+ catch (const XbmcCommons::Exception& e)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: %s",e.GetMessage());
+ PyErr_SetString(PyExc_RuntimeError, e.GetMessage());
+ return NULL;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR,"EXCEPTION: Unknown exception thrown from the call \"${classNameAsVariable}_getMember()\"");
+ PyErr_SetString(PyExc_RuntimeError, "Unknown exception thrown from the call \"${classNameAsVariable}_getMember()\"");
+ return NULL;
+ }
+
+<%
+ properties_set.each {
+%> if (strcmp((char*)name, "${it.@sym_name}") == 0)
+ {
+ ${SwigTypeParser.SwigType_lstr(it.@type)} tmp;
+ ${Helper.getInConversion(it.@type, 'tmp', 'value', it)}
+ if (PyErr_Occurred())
+ throw PythonBindings::PythonToCppException();
+
+ theObj->${it.@sym_name} = tmp;
+ }
+ else<%
+ } %>
+ return -1;
+
+ return 0;
+ } <%
+ }
+%>
+
+ // All of the methods on this class
+ static PyGetSetDef ${classNameAsVariable}_getsets[] = { <%
+ properties.each { %>
+ {(char*)"${it.@sym_name}", (getter)${classNameAsVariable}_getMember, ${(it.@feature_immutable == null || it.@feature_immutable == 0) ? '(setter)' + classNameAsVariable + '_setMember' : 'NULL'}, (char*)${Helper.hasDoc(it) ? PythonTools.makeDocString(it.doc[0]) : 'NULL'}, (char*)"${it.@sym_name}" }, <% }
+%>
+ {NULL}
+ };
+<%
+ } %>
+
// This method initializes the above mentioned Python Type structure
static void ${initTypeCall}()
{
Py${classNameAsVariable}_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
Py${classNameAsVariable}_Type.tp_doc = ${Helper.hasDoc(clazz) ? (classNameAsVariable + '__doc__') : 'NULL' };
- Py${classNameAsVariable}_Type.tp_methods = ${classNameAsVariable}_methods;
+ Py${classNameAsVariable}_Type.tp_methods = ${classNameAsVariable}_methods; <%
+ if (properties.size() > 0) { %>
+ Py${classNameAsVariable}_Type.tp_getset = ${classNameAsVariable}_getsets;
<%
- if (doAsMapping)
- {
-%> Py${classNameAsVariable}_Type.tp_as_mapping = &${module.@name}_${classNameAsVariable}_as_mapping;
+ }
+ if (doAsMapping) { %>
+ Py${classNameAsVariable}_Type.tp_as_mapping = &${module.@name}_${classNameAsVariable}_as_mapping;
<% }
Node baseclass = PythonTools.findValidBaseClass(clazz, module)
PyEval_AcquireLock();
PyThreadState_Swap(state);
+ bool failed = false;
if (!stopping)
{
try
catch (const XbmcCommons::Exception& e)
{
e.LogThrowMessage();
+ failed = true;
}
catch (...)
{
CLog::Log(LOGERROR, "failure in %s", m_source);
+ failed = true;
}
}
bool systemExitThrown = false;
- if (!PyErr_Occurred())
+ if (!failed && !PyErr_Occurred())
CLog::Log(LOGINFO, "Scriptresult: Success");
else if (PyErr_ExceptionMatches(PyExc_SystemExit))
{
}
else
{
- PythonBindings::PythonToCppException e;
- e.LogThrowMessage();
+ // if it failed with an exception we already logged the details
+ if (!failed)
+ {
+ PythonBindings::PythonToCppException e;
+ e.LogThrowMessage();
+ }
{
CPyThreadState releaseGil;
}
}
+ // no need to do anything else because the script has already stopped
+ if (failed)
+ return;
+
PyObject *m = PyImport_AddModule((char*)"xbmc");
if(!m || PyObject_SetAttrString(m, (char*)"abortRequested", PyBool_FromLong(1)))
CLog::Log(LOGERROR, "Scriptresult: failed to set abortRequested");
#include "OMXClock.h"
#include "utils/MathUtils.h"
-#define OMX_PRE_ROLL 800
+#define OMX_PRE_ROLL 200
OMXClock::OMXClock()
{
m_fps = 25.0f;
m_omx_speed = DVD_PLAYSPEED_NORMAL;
- m_audio_buffer = false;
m_clock = NULL;
pthread_mutex_init(&m_lock, NULL);
OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE refClock;
OMX_INIT_STRUCTURE(refClock);
- if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && m_has_video)
- refClock.eClock = OMX_TIME_RefClockVideo;
- else if(m_has_audio)
+ if(m_has_audio)
refClock.eClock = OMX_TIME_RefClockAudio;
else
refClock.eClock = OMX_TIME_RefClockVideo;
m_video_start = false;
m_audio_start = false;
m_pause = false;
- m_audio_buffer = false;
m_clock = clock;
return true;
}
-bool OMXClock::OMXStart(bool lock /* = true */)
-{
- if(m_omx_clock.GetComponent() == NULL)
- return false;
-
- if(lock)
- Lock();
-
- CLog::Log(LOGDEBUG, "OMXClock::OMXStart\n");
-
- OMX_ERRORTYPE omx_err = OMX_ErrorNone;
- OMX_TIME_CONFIG_CLOCKSTATETYPE clock;
- OMX_INIT_STRUCTURE(clock);
-
- clock.eState = OMX_TIME_ClockStateRunning;
- clock.nOffset = ToOMXTime(-1000LL * OMX_PRE_ROLL);
-
- omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeClockState, &clock);
- if(omx_err != OMX_ErrorNone)
- {
- CLog::Log(LOGERROR, "OMXClock::Start error setting OMX_IndexConfigTimeClockState\n");
- if(lock)
- UnLock();
- return false;
- }
-
- if(lock)
- UnLock();
-
- return true;
-}
-
-void OMXClock::VideoStart(bool video_start)
-{
- Lock();
- m_video_start = video_start;
- UnLock();
-};
-
-void OMXClock::AudioStart(bool audio_start)
-{
- Lock();
- m_audio_start = audio_start;
- UnLock();
-};
-
bool OMXClock::OMXStep(int steps /* = 1 */, bool lock /* = true */)
{
if(m_omx_clock.GetComponent() == NULL)
if(lock)
Lock();
- m_audio_buffer = false;
-
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
if(!OMXSetReferenceClock(false))
return false;
}
- clock.eState = OMX_TIME_ClockStateWaitingForStartTime;
- clock.nOffset = ToOMXTime(-1000LL * OMX_PRE_ROLL);
+ OMX_TIME_CLOCKSTATE old_eState = clock.eState;
+ if (clock.eState == OMX_TIME_ClockStateStopped)
+ {
+ clock.eState = OMX_TIME_ClockStateWaitingForStartTime;
+ clock.nOffset = ToOMXTime(-1000LL * OMX_PRE_ROLL);
- OMXSetClockPorts(&clock);
+ OMXSetClockPorts(&clock);
- if(clock.nWaitMask)
- {
- omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeClockState, &clock);
- if(omx_err != OMX_ErrorNone)
+ if(clock.nWaitMask)
{
- CLog::Log(LOGERROR, "OMXClock::OMXReset error setting OMX_IndexConfigTimeClockState\n");
- if(lock)
- UnLock();
- return false;
+ omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeClockState, &clock);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "OMXClock::OMXReset error setting OMX_IndexConfigTimeClockState\n");
+ if(lock)
+ UnLock();
+ return false;
+ }
}
}
-
- CLog::Log(LOGDEBUG, "OMXClock::OMXReset audio / video : %d / %d start audio / video : %d / %d wait mask %d\n",
- m_has_audio, m_has_video, m_audio_start, m_video_start, clock.nWaitMask);
+ CLog::Log(LOGDEBUG, "OMXClock::OMXReset audio / video : %d / %d start audio / video : %d / %d wait mask %d state : %d->%d\n",
+ m_has_audio, m_has_video, m_audio_start, m_video_start, clock.nWaitMask, old_eState, clock.eState);
if(lock)
UnLock();
return true;
}
-double OMXClock::OMXMediaTime(bool fixPreroll /* true */ , bool lock /* = true */)
+double OMXClock::OMXMediaTime(bool lock /* = true */)
{
if(m_omx_clock.GetComponent() == NULL)
return 0;
pts = FromOMXTime(timeStamp.nTimestamp);
- if(fixPreroll)
- pts += (OMX_PRE_ROLL * 1000);
-
if(lock)
UnLock();
// Set the media time, so calls to get media time use the updated value,
// useful after a seek so mediatime is updated immediately (rather than waiting for first decoded packet)
-bool OMXClock::OMXMediaTime(double pts, bool fixPreroll /* = true*/, bool lock /* = true*/)
+bool OMXClock::OMXMediaTime(double pts, bool lock /* = true*/)
{
if(m_omx_clock.GetComponent() == NULL)
return false;
OMX_INIT_STRUCTURE(timeStamp);
timeStamp.nPortIndex = m_omx_clock.GetInputPort();
- if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && m_has_video)
- index = OMX_IndexConfigTimeCurrentVideoReference;
- else if(m_has_audio)
+ if(m_has_audio)
index = OMX_IndexConfigTimeCurrentAudioReference;
else
index = OMX_IndexConfigTimeCurrentVideoReference;
- if(fixPreroll)
- pts -= (OMX_PRE_ROLL * 1000);
timeStamp.nTimestamp = ToOMXTime(pts);
omx_err = m_omx_clock.SetConfig(index, &timeStamp);
if(lock)
Lock();
- if (OMXSetSpeed(m_omx_speed, false, true))
+ if (OMXSetSpeed(DVD_PLAYSPEED_NORMAL, false, true))
m_pause = false;
if(lock)
if(lock)
Lock();
- m_audio_buffer = false;
-
- CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.2f) pause_resume:%d audio_buffer:%d", (float)m_omx_speed / (float)DVD_PLAYSPEED_NORMAL, pause_resume, m_audio_buffer);
-
- OMX_ERRORTYPE omx_err = OMX_ErrorNone;
- OMX_TIME_CONFIG_SCALETYPE scaleType;
- OMX_INIT_STRUCTURE(scaleType);
+ CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.2f) pause_resume:%d", (float)speed / (float)DVD_PLAYSPEED_NORMAL, pause_resume);
- scaleType.xScale = (speed << 16) / DVD_PLAYSPEED_NORMAL;
- omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeScale, &scaleType);
- if(omx_err != OMX_ErrorNone)
+ if (pause_resume)
{
- CLog::Log(LOGERROR, "OMXClock::OMXSetSpeed error setting OMX_IndexConfigTimeClockState\n");
- if(lock)
- UnLock();
- return false;
- }
+ OMX_ERRORTYPE omx_err = OMX_ErrorNone;
+ OMX_TIME_CONFIG_SCALETYPE scaleType;
+ OMX_INIT_STRUCTURE(scaleType);
+ scaleType.xScale = (speed << 16) / DVD_PLAYSPEED_NORMAL;
+ omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeScale, &scaleType);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "OMXClock::OMXSetSpeed error setting OMX_IndexConfigTimeClockState\n");
+ if(lock)
+ UnLock();
+ return false;
+ }
+ }
if (!pause_resume)
m_omx_speed = speed;
return true;
}
-void OMXClock::OMXAudioBufferStart()
-{
- Lock();
-
- m_audio_buffer = true;
-
- // only buffer when we are in normal playspeed
- if(m_omx_clock.GetComponent() == NULL || m_omx_speed != DVD_PLAYSPEED_NORMAL)
- {
- UnLock();
- return;
- }
-
- OMX_ERRORTYPE omx_err = OMX_ErrorNone;
- OMX_TIME_CONFIG_SCALETYPE scaleType;
- OMX_INIT_STRUCTURE(scaleType);
-
- scaleType.xScale = 0;
-
- CLog::Log(LOGDEBUG, "OMXClock::OMXAudioBufferStart");
-
- omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeScale, &scaleType);
- if(omx_err != OMX_ErrorNone)
- CLog::Log(LOGERROR, "OMXClock::OMXAudioBufferStart error setting OMX_IndexConfigTimeClockState\n");
-
- UnLock();
-}
-
-void OMXClock::OMXAudioBufferStop()
-{
- Lock();
-
- CLog::Log(LOGDEBUG, "OMXClock::OMXAudioBufferStop");
-
- m_audio_buffer = false;
-
- OMXSetSpeed(m_omx_speed, false);
-
- UnLock();
-}
-
double OMXClock::NormalizeFrameduration(double frameduration)
{
//if the duration is within 20 microseconds of a common duration, use that
int m_omx_speed;
bool m_video_start;
bool m_audio_start;
- bool m_audio_buffer;
CDVDClock *m_clock;
private:
COMXCoreComponent m_omx_clock;
void OMXDeinitialize();
bool OMXIsPaused() { return m_pause; };
bool OMXStop(bool lock = true);
- bool OMXStart(bool lock = true);
bool OMXStep(int steps = 1, bool lock = true);
bool OMXReset(bool lock = true);
- double OMXMediaTime(bool fixPreroll = true, bool lock = true);
+ double OMXMediaTime(bool lock = true);
double OMXClockAdjustment(bool lock = true);
- bool OMXMediaTime(double pts, bool fixPreroll = true, bool lock = true);
+ bool OMXMediaTime(double pts, bool lock = true);
bool OMXPause(bool lock = true);
bool OMXResume(bool lock = true);
bool OMXSetSpeed(int speed, bool lock = true, bool pause_resume = false);
bool HasAudio() { return m_has_audio; };
void HasVideo(bool has_video) { m_has_video = has_video; };
void HasAudio(bool has_audio) { m_has_audio = has_audio; };
- bool VideoStart() { return m_video_start; };
- bool AudioStart() { return m_audio_start; };
- void VideoStart(bool video_start);
- void AudioStart(bool audio_start);
- void OMXAudioBufferStart();
- void OMXAudioBufferStop();
- bool OMXAudioBuffer() { return m_audio_buffer; };
int GetRefreshRate(double* interval = NULL);
void SetRefreshRate(double fps) { m_fps = fps; };
CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventPortSettingsChanged(output)\n", CLASSNAME, __func__, ctx->GetName().c_str());
#endif
break;
+ case OMX_EventParamOrConfigChanged:
+ #if defined(OMX_DEBUG_EVENTHANDLER)
+ CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventParamOrConfigChanged(output)\n", CLASSNAME, __func__, ctx->GetName().c_str());
+ #endif
+ break;
#if defined(OMX_DEBUG_EVENTHANDLER)
case OMX_EventMark:
CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventMark\n", CLASSNAME, __func__, ctx->GetName().c_str());
if(!m_omx_initialized)
return false;
+ char response[80] = "";
+ m_arm_mem = 0;
+ m_gpu_mem = 0;
+ if (vc_gencmd(response, sizeof response, "get_mem arm") == 0)
+ vc_gencmd_number_property(response, "arm", &m_arm_mem);
+ if (vc_gencmd(response, sizeof response, "get_mem gpu") == 0)
+ vc_gencmd_number_property(response, "gpu", &m_gpu_mem);
+
return true;
}
m_DllBcmHost->vc_gencmd(response, sizeof response, "version");
response[sizeof(response) - 1] = '\0';
CLog::Log(LOGNOTICE, "Raspberry PI firmware version: %s", response);
+ CLog::Log(LOGNOTICE, "ARM mem: %dMB GPU mem: %dMB", m_arm_mem, m_gpu_mem);
}
void CRBP::Deinitialize()
bool Initialize();
void LogFirmwareVerison();
void Deinitialize();
+ int GetArmMem() { return m_arm_mem; }
+ int GetGpuMem() { return m_gpu_mem; }
private:
DllBcmHost *m_DllBcmHost;
bool m_initialized;
bool m_omx_initialized;
+ int m_arm_mem;
+ int m_gpu_mem;
COMXCore *m_OMX;
};
CStdString CAlbum::GetGenreString() const
{
- return StringUtils::Join(artist, g_advancedSettings.m_musicItemSeparator);
+ return StringUtils::Join(genre, g_advancedSettings.m_musicItemSeparator);
}
bool CAlbum::operator<(const CAlbum &a) const
return idSong;
}
- int CMusicDatabase::UpdateSong(int idSong,
- const CStdString& strTitle, const CStdString& strMusicBrainzTrackID,
- const CStdString& strPathAndFileName, const CStdString& strComment, const CStdString& strThumb,
- const std::vector<std::string>& artists, const std::vector<std::string>& genres,
- int iTrack, int iDuration, int iYear,
- int iTimesPlayed, int iStartOffset, int iEndOffset,
- const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber)
+int CMusicDatabase::UpdateSong(int idSong,
+ const CStdString& strTitle, const CStdString& strMusicBrainzTrackID,
+ const CStdString& strPathAndFileName, const CStdString& strComment, const CStdString& strThumb,
+ const std::vector<std::string>& artists, const std::vector<std::string>& genres,
+ int iTrack, int iDuration, int iYear,
+ int iTimesPlayed, int iStartOffset, int iEndOffset,
+ const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber)
{
CStdString sql;
if (idSong < 0)
SetArtForItem(idAlbum, "album", "thumb", strThumb);
// TODO: We should prompt the user to update the art for songs
CStdString sql = PrepareSQL("UPDATE art"
- " SET art_url='-'"
+ " SET url='-'"
" WHERE media_type='song'"
- " AND art_type='thumb'"
+ " AND type='thumb'"
" AND media_id IN"
" (SELECT idSong FROM song WHERE idAlbum=%ld)", idAlbum);
ExecuteQuery(sql);
// No - download the information
CMusicAlbumInfo albumInfo;
INFO_RET albumDownloadStatus = INFO_NOT_FOUND;
- if (m_flags & SCAN_ONLINE)
+ if ((m_flags & SCAN_ONLINE) && albumScraper)
albumDownloadStatus = DownloadAlbumInfo(*album, albumScraper, albumInfo);
if (albumDownloadStatus == INFO_ADDED || albumDownloadStatus == INFO_HAVE_ALREADY)
}
else if (albumDownloadStatus == INFO_CANCELLED)
break;
- else // Cache the lookup failure so we don't retry
+ else
{
+ // No download info, fallback to already gathered (eg. local) information/art (if any)
album->idAlbum = m_musicDatabase.AddAlbum(album->strAlbum,
album->strMusicBrainzAlbumID,
album->GetArtistString(),
album->GetGenreString(),
album->iYear,
album->bCompilation);
+ if (!album->art.empty())
+ m_musicDatabase.SetArtForItem(album->idAlbum,
+ "album", album->art);
m_albumCache.insert(make_pair(*album, *album));
}
// No - download the information
CMusicArtistInfo artistInfo;
INFO_RET artistDownloadStatus = INFO_NOT_FOUND;
- if (m_flags & SCAN_ONLINE)
+ if ((m_flags & SCAN_ONLINE) && artistScraper)
artistDownloadStatus = DownloadArtistInfo(artistTmp, artistScraper, artistInfo);
if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY)
// No - download the information
CMusicArtistInfo artistInfo;
INFO_RET artistDownloadStatus = INFO_NOT_FOUND;
- if (m_flags & SCAN_ONLINE)
+ if ((m_flags & SCAN_ONLINE) && artistScraper)
artistDownloadStatus = DownloadArtistInfo(artistTmp, artistScraper, artistInfo);
if (artistDownloadStatus == INFO_ADDED || artistDownloadStatus == INFO_HAVE_ALREADY)
}
}
if (albums.size() == 1 && !albumArt.empty())
- { // assign to folder thumb as well
- CMusicThumbLoader::SetCachedImage(path, "thumb", albumArt);
+ {
+ // assign to folder thumb as well
+ CFileItem albumItem(path, true);
+ CMusicThumbLoader::SetCachedImage(albumItem, "thumb", albumArt);
}
}
// find album info
ADDON::ScraperPtr scraper;
- if (!m_musicDatabase.GetScraperForPath(strPath, scraper, ADDON::ADDON_SCRAPER_ALBUMS) || !scraper)
- return INFO_ERROR;
+ bool result = m_musicDatabase.GetScraperForPath(strPath, scraper, ADDON::ADDON_SCRAPER_ALBUMS);
+
m_musicDatabase.Close();
+ if (!result || !scraper)
+ return INFO_ERROR;
+
loop:
CLog::Log(LOGDEBUG, "%s downloading info for: %s", __FUNCTION__, album.strAlbum.c_str());
INFO_RET albumDownloadStatus = DownloadAlbumInfo(album, scraper, albumInfo, pDialog);
}
}
- // check the first song we find in the folder, and grab it's album info
+ // check the first song we find in the folder, and grab its album info
for (int i = 0; i < items.Size(); i++)
{
CFileItemPtr pItem = items[i];
if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded() &&
!pItem->GetMusicInfoTag()->GetAlbum().IsEmpty())
{
- ShowAlbumInfo(pItem.get());
+ bool result = ShowAlbumInfo(pItem.get());
+
if (m_dlgProgress && bShowInfo)
m_dlgProgress->Close();
+
+ if (!result) // Something went wrong, so bail for the rest
+ break;
}
}
m_dlgProgress->Close();
}
-void CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */)
+bool CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */)
{
CQueryParams params;
CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params);
!m_musicdatabase.GetAlbumInfo(params.GetAlbumId(), albumInfo.GetAlbum(), &albumInfo.GetAlbum().songs))
{
if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser)
- break; // should display a dialog saying no permissions
+ {
+ // TODO: should display a dialog saying no permissions
+ if (m_dlgProgress)
+ m_dlgProgress->Close();
+ return false;
+ }
if (g_application.IsMusicScanning())
{
CGUIDialogOK::ShowAndGetInput(189, 14057, 0, 0);
- break;
+ if (m_dlgProgress)
+ m_dlgProgress->Close();
+ return false;
}
// show dialog box indicating we're searching the album
if (scanner.UpdateDatabaseAlbumInfo(pItem->GetPath(), albumInfo, bShowInfo) != INFO_ADDED || !albumInfo.Loaded())
{
CGUIDialogOK::ShowAndGetInput(185, 0, 500, 0);
- break;
+ if (m_dlgProgress)
+ m_dlgProgress->Close();
+ return false;
}
}
}
if (m_dlgProgress)
m_dlgProgress->Close();
+ return true;
}
void CGUIWindowMusicBase::ShowSongInfo(CFileItem* pItem)
bool FindAlbumInfo(const CFileItem* album, MUSIC_GRABBER::CMusicAlbumInfo& albumInfo, ALLOW_SELECTION allowSelection);
bool FindArtistInfo(const CFileItem* artist, MUSIC_GRABBER::CMusicArtistInfo& artistInfo, ALLOW_SELECTION allowSelection);
- void ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo = true);
+ bool ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo = true);
void ShowArtistInfo(const CFileItem *pItem, bool bShowInfo = true);
void ShowSongInfo(CFileItem* pItem);
void UpdateThumb(const CAlbum &album, const CStdString &path);
if (request.method == POST)
{
string contentType = CWebServer::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE);
- // If the content-type of the request was specified, it must be application/json
- if (!contentType.empty() && contentType.compare("application/json") != 0)
+ // If the content-type of the request was specified, it must be application/json-rpc, application/json, or application/jsonrequest
+ // http://www.jsonrpc.org/historical/json-rpc-over-http.html
+ if (!contentType.empty() && contentType.compare("application/json-rpc") != 0 &&
+ contentType.compare("application/json") != 0 && contentType.compare("application/jsonrequest") != 0)
{
m_responseType = HTTPError;
m_responseCode = MHD_HTTP_UNSUPPORTED_MEDIA_TYPE;
<key>CFBundleExecutable</key>
<string>XBMC</string>
<key>CFBundleGetInfoString</key>
- <string>13.0.alpha5</string>
+ <string>13.0.alpha6</string>
<key>CFBundleIconFile</key>
<string>xbmc.icns</string>
<key>CFBundleIdentifier</key>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>13.0.alpha5</string>
+ <string>13.0.alpha6</string>
<key>CFBundleVersion</key>
<string>r####</string>
<key>CFBundleSignature</key>
CGUIDialogPVRChannelManager::CGUIDialogPVRChannelManager(void) :
CGUIDialog(WINDOW_DIALOG_PVR_CHANNEL_MANAGER, "DialogPVRChannelManager.xml"),
m_bIsRadio(false),
+ m_bMovingMode(false),
+ m_bContainsChanges(false),
+ m_iSelected(0),
m_channelItems(new CFileItemList)
{
}
CGUIDialog::OnAction(action);
}
-bool CGUIDialogPVRChannelManager::OnMessageInit(CGUIMessage &message)
+void CGUIDialogPVRChannelManager::OnInitWindow()
{
- CGUIWindow::OnMessage(message);
+ CGUIDialog::OnInitWindow();
+
m_iSelected = 0;
m_bIsRadio = false;
m_bMovingMode = false;
SetProperty("IsRadio", "");
Update();
SetData(m_iSelected);
+}
- return true;
+void CGUIDialogPVRChannelManager::OnDeinitWindow(int nextWindowID)
+{
+ Clear();
+
+ CGUIDialog::OnDeinitWindow(nextWindowID);
}
bool CGUIDialogPVRChannelManager::OnClickListChannels(CGUIMessage &message)
switch (iMessage)
{
- case GUI_MSG_WINDOW_DEINIT:
- Clear();
- break;
- case GUI_MSG_WINDOW_INIT:
- return OnMessageInit(message);
case GUI_MSG_CLICKED:
return OnMessageClick(message);
}
virtual CFileItemPtr GetCurrentListItem(int offset = 0);
protected:
+ virtual void OnInitWindow();
+ virtual void OnDeinitWindow(int nextWindowID);
+
virtual bool OnPopupMenu(int iItem);
virtual bool OnContextButton(int itemNumber, CONTEXT_BUTTON button);
virtual bool OnActionMove(const CAction &action);
- virtual bool OnMessageInit(CGUIMessage &message);
virtual bool OnMessageClick(CGUIMessage &message);
virtual bool OnClickListChannels(CGUIMessage &message);
{
switch (message.GetMessage())
{
- case GUI_MSG_WINDOW_DEINIT:
- {
- if (m_group)
- {
- g_PVRManager.SetPlayingGroup(m_group);
- SetLastSelectedItem(m_group->GroupID());
- }
- Clear();
- }
- break;
-
- case GUI_MSG_WINDOW_INIT:
- {
- /* Close dialog immediately if now TV or radio channel is playing */
- if (!g_PVRManager.IsPlaying())
- {
- Close();
- return true;
- }
-
- m_group = GetPlayingGroup();
-
- CGUIWindow::OnMessage(message);
- Update(true);
-
- return true;
- }
- break;
-
case GUI_MSG_CLICKED:
{
int iControl = message.GetSenderId();
return CGUIDialog::OnMessage(message);
}
+void CGUIDialogPVRChannelsOSD::OnInitWindow()
+{
+ /* Close dialog immediately if now TV or radio channel is playing */
+ if (!g_PVRManager.IsPlaying())
+ {
+ Close();
+ return;
+ }
+
+ Update();
+
+ CGUIDialog::OnInitWindow();
+}
+
+void CGUIDialogPVRChannelsOSD::OnDeinitWindow(int nextWindowID)
+{
+ if (m_group)
+ {
+ g_PVRManager.SetPlayingGroup(m_group);
+ m_group.reset();
+ }
+
+ CGUIDialog::OnDeinitWindow(nextWindowID);
+
+ Clear();
+}
+
bool CGUIDialogPVRChannelsOSD::OnAction(const CAction &action)
{
switch (action.GetID())
case ACTION_PREVIOUS_CHANNELGROUP:
case ACTION_NEXT_CHANNELGROUP:
{
+ // save control states and currently selected item of group
+ SaveControlStates();
+
+ // switch to next or previous group
CPVRChannelGroupPtr group = GetPlayingGroup();
CPVRChannelGroupPtr nextGroup = action.GetID() == ACTION_NEXT_CHANNELGROUP ? group->GetNextGroup() : group->GetPreviousGroup();
g_PVRManager.SetPlayingGroup(nextGroup);
- SetLastSelectedItem(group->GroupID());
Update();
+
+ // restore control states and previously selected item of group
+ RestoreControlStates();
return true;
}
}
void CGUIDialogPVRChannelsOSD::Update()
{
- CGUIDialogPVRChannelsOSD::Update(false);
-}
-
-void CGUIDialogPVRChannelsOSD::Update(bool selectPlayingChannel)
-{
// lock our display, as this window is rendered from the player thread
g_graphicsContext.Lock();
{
group->GetMembers(*m_vecItems);
m_viewControl.SetItems(*m_vecItems);
- m_viewControl.SetSelectedItem(selectPlayingChannel ? group->GetIndex(*channel) : GetLastSelectedItem(group->GroupID()));
+
+ if(!m_group)
+ {
+ m_group = group;
+ m_viewControl.SetSelectedItem(group->GetIndex(*channel));
+ SaveSelectedItem(group->GroupID());
+ }
}
g_graphicsContext.Unlock();
}
+void CGUIDialogPVRChannelsOSD::SaveControlStates()
+{
+ CGUIDialog::SaveControlStates();
+
+ CPVRChannelGroupPtr group = GetPlayingGroup();
+ SaveSelectedItem(group->GroupID());
+}
+
+void CGUIDialogPVRChannelsOSD::RestoreControlStates()
+{
+ CGUIDialog::RestoreControlStates();
+
+ CPVRChannelGroupPtr group = GetPlayingGroup();
+ if(group)
+ {
+ m_viewControl.SetSelectedItem(GetLastSelectedItem(group->GroupID()));
+ }
+}
+
void CGUIDialogPVRChannelsOSD::Clear()
{
m_viewControl.Clear();
}
}
-void CGUIDialogPVRChannelsOSD::SetLastSelectedItem(int iGroupID)
+void CGUIDialogPVRChannelsOSD::SaveSelectedItem(int iGroupID)
{
m_groupSelectedItems[iGroupID] = m_viewControl.GetSelectedItem();
}
virtual void Notify(const Observable &obs, const ObservableMessage msg);
protected:
+ virtual void OnInitWindow();
+ virtual void OnDeinitWindow(int nextWindowID);
+ virtual void RestoreControlStates();
+ virtual void SaveControlStates();
+
void CloseOrSelect(unsigned int iItem);
void GotoChannel(int iItem);
void ShowInfo(int item);
void Clear();
void Update();
- void Update(bool selectPlayingChannel);
CPVRChannelGroupPtr GetPlayingGroup();
CGUIControl *GetFirstFocusableControl(int id);
private:
CPVRChannelGroupPtr m_group;
std::map<int,int> m_groupSelectedItems;
- void SetLastSelectedItem(int iGroupID);
+ void SaveSelectedItem(int iGroupID);
int GetLastSelectedItem(int iGroupID) const;
};
}
switch (iMessage)
{
- case GUI_MSG_WINDOW_DEINIT:
- {
- Clear();
- }
- break;
-
- case GUI_MSG_WINDOW_INIT:
- {
- CGUIWindow::OnMessage(message);
- m_iSelectedUngroupedChannel = 0;
- m_iSelectedGroupMember = 0;
- m_iSelectedChannelGroup = 0;
- Update();
- return true;
- }
- break;
-
case GUI_MSG_CLICKED:
{
OnMessageClick(message);
return CGUIDialog::OnMessage(message);
}
+void CGUIDialogPVRGroupManager::OnInitWindow()
+{
+ CGUIDialog::OnInitWindow();
+ m_iSelectedUngroupedChannel = 0;
+ m_iSelectedGroupMember = 0;
+ m_iSelectedChannelGroup = 0;
+ Update();
+}
+
+void CGUIDialogPVRGroupManager::OnDeinitWindow(int nextWindowID)
+{
+ Clear();
+ CGUIDialog::OnDeinitWindow(nextWindowID);
+}
+
void CGUIDialogPVRGroupManager::OnWindowLoaded()
{
CGUIDialog::OnWindowLoaded();
void SetRadio(bool IsRadio) { m_bIsRadio = IsRadio; }
protected:
+ virtual void OnInitWindow();
+ virtual void OnDeinitWindow(int nextWindowID);
+
void Clear();
void Update();
{
switch (message.GetMessage())
{
- case GUI_MSG_WINDOW_INIT:
- CGUIDialog::OnMessage(message);
- Update();
- return true;
case GUI_MSG_CLICKED:
return OnClickButtonOK(message) ||
OnClickButtonRecord(message) ||
return m_progItem;
}
-void CGUIDialogPVRGuideInfo::Update()
+void CGUIDialogPVRGuideInfo::OnInitWindow()
{
+ CGUIDialog::OnInitWindow();
+
const CEpgInfoTag *tag = m_progItem->GetEPGInfoTag();
if (!tag)
{
void SetProgInfo(const CFileItem *item);
protected:
- void Update();
+ virtual void OnInitWindow();
+
bool ActionStartTimer(const EPG::CEpgInfoTag *tag);
bool ActionCancelTimer(CFileItemPtr timer);
{
switch (message.GetMessage())
{
- case GUI_MSG_WINDOW_DEINIT:
- {
- Clear();
- }
- break;
-
- case GUI_MSG_WINDOW_INIT:
- {
- /* Close dialog immediately if now TV or radio channel is playing */
- if (!g_PVRManager.IsPlaying())
- {
- Close();
- return true;
- }
- CGUIWindow::OnMessage(message);
- Update();
- return true;
- }
- break;
-
case GUI_MSG_CLICKED:
{
int iControl = message.GetSenderId();
return CGUIDialog::OnMessage(message);
}
-void CGUIDialogPVRGuideOSD::Update()
+void CGUIDialogPVRGuideOSD::OnInitWindow()
{
+ /* Close dialog immediately if no TV or radio channel is playing */
+ if (!g_PVRManager.IsPlaying())
+ {
+ Close();
+ return;
+ }
+
// lock our display, as this window is rendered from the player thread
g_graphicsContext.Lock();
m_viewControl.SetCurrentView(DEFAULT_VIEW_LIST);
g_PVRManager.GetCurrentEpg(*m_vecItems);
m_viewControl.SetItems(*m_vecItems);
- /* select the active entry */
+ g_graphicsContext.Unlock();
+
+ // call init
+ CGUIDialog::OnInitWindow();
+
+ // select the active entry
unsigned int iSelectedItem = 0;
for (int iEpgPtr = 0; iEpgPtr < m_vecItems->Size(); iEpgPtr++)
{
}
}
m_viewControl.SetSelectedItem(iSelectedItem);
+}
- g_graphicsContext.Unlock();
+void CGUIDialogPVRGuideOSD::OnDeinitWindow(int nextWindowID)
+{
+ CGUIDialog::OnDeinitWindow(nextWindowID);
+ Clear();
}
void CGUIDialogPVRGuideOSD::Clear()
virtual void OnWindowUnload();
protected:
+ virtual void OnInitWindow();
+ virtual void OnDeinitWindow(int nextWindowID);
+
void ShowInfo(int iItem);
void Clear();
- void Update();
CGUIControl *GetFirstFocusableControl(int id);
switch (message.GetMessage())
{
- case GUI_MSG_WINDOW_INIT:
- {
- m_bConfirmed = false;
- m_bCanceled = false;
- }
- break;
-
case GUI_MSG_CLICKED:
{
int iControl = message.GetSenderId();
return false;
}
+void CGUIDialogPVRGuideSearch::OnInitWindow()
+{
+ CGUIDialog::OnInitWindow();
+
+ m_bConfirmed = false;
+ m_bCanceled = false;
+}
+
void CGUIDialogPVRGuideSearch::OnWindowLoaded()
{
Update();
void OnSearch();
protected:
+ virtual void OnInitWindow();
+
void UpdateChannelSpin(void);
void UpdateGroupsSpin(void);
void UpdateGenreSpin(void);
: CGUIDialogSettings(WINDOW_DIALOG_PVR_TIMER_SETTING, "DialogPVRTimerSettings.xml")
{
m_cancelled = true;
- m_tmp_day = 11;
+ m_tmp_day = 11;
+ m_bTimerActive = false;
+ m_tmp_iFirstDay = 0;
+ m_timerItem = NULL;
m_loadType = LOAD_EVERY_TIME;
}
//m_videoStackRegExps.push_back("(.*?)([ ._-]*[0-9])(.*?)(\\.[^.]+)$");
// foo.s01.e01, foo.s01_e01, S01E02 foo, S01 - E02
- m_tvshowEnumRegExps.push_back(TVShowRegexp(false,"[Ss]([0-9]+)[][ ._-]*[Ee]([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)([^\\\\/]*)$"));
+ m_tvshowEnumRegExps.push_back(TVShowRegexp(false,"s([0-9]+)[ ._-]*e([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)([^\\\\/]*)$"));
// foo.ep01, foo.EP_01
- m_tvshowEnumRegExps.push_back(TVShowRegexp(false,"[\\._ -]()[Ee][Pp]_?([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)([^\\\\/]*)$"));
+ m_tvshowEnumRegExps.push_back(TVShowRegexp(false,"[\\._ -]()ep_?([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)([^\\\\/]*)$"));
// foo.yyyy.mm.dd.* (byDate=true)
m_tvshowEnumRegExps.push_back(TVShowRegexp(true,"([0-9]{4})[\\.-]([0-9]{2})[\\.-]([0-9]{2})"));
// foo.mm.dd.yyyy.* (byDate=true)
// Part I, Pt.VI
m_tvshowEnumRegExps.push_back(TVShowRegexp(false,"[\\/._ -]p(?:ar)?t[_. -]()([ivx]+)([._ -][^\\/]*)$"));
- m_tvshowMultiPartEnumRegExp = "^[-_EeXx]+([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)";
+ m_tvshowMultiPartEnumRegExp = "^[-_ex]+([0-9]+(?:(?:[a-i]|\\.[1-9])(?![0-9]))?)";
m_remoteDelay = 3;
m_controllerDeadzone = 0.2f;
Close();
}
-bool CBitstreamConverter::Open(enum CodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb)
+bool CBitstreamConverter::Open(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb)
{
m_codec = codec;
m_to_annexb = to_annexb;
switch(codec)
{
- case CODEC_ID_H264:
+ case AV_CODEC_ID_H264:
if (in_extrasize < 7 || in_extradata == NULL)
{
CLog::Log(LOGERROR, "CBitstreamConverter::Open avcC data too small or missing\n");
if (pData)
{
- if (m_codec == CODEC_ID_H264)
+ if (m_codec == AV_CODEC_ID_H264)
{
if (m_to_annexb)
{
static void skip_bits( bits_reader_t *br, int nbits );
static uint32_t get_bits( bits_reader_t *br, int nbits );
- bool Open(enum CodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb);
+ bool Open(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb);
void Close(void);
bool NeedConvert(void) { return m_convert_bitstream; };
bool Convert(uint8_t *pData, int iSize);
bool m_convert_bytestream;
DllAvUtil *m_dllAvUtil;
DllAvFormat *m_dllAvFormat;
- CodecID m_codec;
+ AVCodecID m_codec;
};
#endif
for (unsigned int i=0;i<expression.size();++i)
{
- CRegExp reg;
+ CRegExp reg(true);
if (!reg.RegComp(expression[i].regexp))
continue;
// add what we found by now
episodeList.push_back(episode);
- CRegExp reg2;
+ CRegExp reg2(true);
// check the remainder of the string for any further episodes.
if (!byDate && reg2.RegComp(g_advancedSettings.m_tvshowMultiPartEnumRegExp))
{
CNfoFile::NFOResult result=CNfoFile::NO_NFO;
if (!strNfoFile.IsEmpty() && CFile::Exists(strNfoFile))
{
- result = m_nfoReader.Create(strNfoFile,info,pItem->GetVideoInfoTag()->m_iEpisode);
+ if (info->Content() == CONTENT_TVSHOWS && !pItem->m_bIsFolder)
+ result = m_nfoReader.Create(strNfoFile,info,pItem->GetVideoInfoTag()->m_iEpisode);
+ else
+ result = m_nfoReader.Create(strNfoFile,info);
CStdString type;
switch(result)
BEGIN
VALUE "CompanyName", "Team XBMC"
VALUE "FileDescription", "XBMC"
- VALUE "FileVersion", "13.0-ALPHA5"
+ VALUE "FileVersion", "13.0-ALPHA6"
VALUE "InternalName", "XBMC.exe"
VALUE "LegalCopyright", "Copyright (c) Team XBMC. All rights reserved."
VALUE "OriginalFilename", "XBMC.exe"
VALUE "ProductName", "XBMC for Windows"
- VALUE "ProductVersion", "13.0-ALPHA5"
+ VALUE "ProductVersion", "13.0-ALPHA6"
END
END
BLOCK "VarFileInfo"