300 continue; |
300 continue; |
301 AVCodecContext* pCodec = pContext->streams[i]->codec; |
301 AVCodecContext* pCodec = pContext->streams[i]->codec; |
302 if (!pCodec) |
302 if (!pCodec) |
303 continue; |
303 continue; |
304 |
304 |
|
305 |
|
306 AVCodec* pDecoder = avcodec_find_decoder(pCodec->codec_id); |
|
307 QString decoderName = pDecoder ? pDecoder->name : tr("unknown"); |
305 if (pCodec->codec_type == AVMEDIA_TYPE_VIDEO) |
308 if (pCodec->codec_type == AVMEDIA_TYPE_VIDEO) |
306 { |
309 { |
307 desc += QString(tr("Video: %1x%2")).arg(pCodec->width).arg(pCodec->height) + ", "; |
|
308 if (pStream->avg_frame_rate.den) |
310 if (pStream->avg_frame_rate.den) |
309 { |
311 { |
310 float fps = float(pStream->avg_frame_rate.num)/pStream->avg_frame_rate.den; |
312 float fps = float(pStream->avg_frame_rate.num)/pStream->avg_frame_rate.den; |
311 desc += QString(tr("%1 FPS")).arg(fps, 0, 'f', 2) + ", "; |
313 //: Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name |
|
314 desc += QString(tr("Video: %1x%2, %3 FPS, %4")).arg(pCodec->width).arg(pCodec->height).arg(QLocale().toString(fps, 'f', 2)).arg(decoderName); |
312 } |
315 } |
|
316 else |
|
317 { |
|
318 //: Video metadata. %1 = video width, %2 = video height, %3 = decoder name |
|
319 desc += QString(tr("Video: %1x%2, %3")).arg(pCodec->width).arg(pCodec->height).arg(decoderName); |
|
320 } |
313 } |
321 } |
314 else if (pCodec->codec_type == AVMEDIA_TYPE_AUDIO) |
322 else if (pCodec->codec_type == AVMEDIA_TYPE_AUDIO) |
|
323 { |
315 desc += tr("Audio: "); |
324 desc += tr("Audio: "); |
|
325 desc += decoderName; |
|
326 } |
316 else |
327 else |
317 continue; |
328 continue; |
318 AVCodec* pDecoder = avcodec_find_decoder(pCodec->codec_id); |
|
319 desc += pDecoder? pDecoder->name : tr("unknown"); |
|
320 desc += "\n"; |
329 desc += "\n"; |
321 } |
330 } |
322 AVDictionaryEntry* pComment = av_dict_get(pContext->metadata, "comment", NULL, 0); |
331 AVDictionaryEntry* pComment = av_dict_get(pContext->metadata, "comment", NULL, 0); |
323 if (pComment) |
332 if (pComment) |
324 desc += QString("\n") + pComment->value; |
333 { |
|
334 // Video comment. We expect a simple key value storage in a particular format |
|
335 // and parse it here so the key names can be localized. |
|
336 desc += QString("\n"); |
|
337 QStringList strings = QString(pComment->value).split('\n'); |
|
338 QString sPlayer, sTheme, sMap, sRecord; |
|
339 for(int i=0; i < strings.count(); i++) |
|
340 { |
|
341 QString s = strings.at(i); |
|
342 // Original key names are in English, like: |
|
343 // Key: Value |
|
344 if (s.startsWith("Player: ")) |
|
345 sPlayer = QString(s.mid(8)); |
|
346 else if (s.startsWith("Theme: ")) |
|
347 sTheme = QString(s.mid(7)); |
|
348 else if (s.startsWith("Map: ")) |
|
349 sMap = QString(s.mid(5)); |
|
350 else if (s.startsWith("Record: ")) |
|
351 sRecord = QString(s.mid(8)); |
|
352 } |
|
353 if(!sPlayer.isNull()) |
|
354 desc += QString(tr("Player: %1")).arg(sPlayer) + "\n"; |
|
355 if(!sTheme.isNull()) |
|
356 desc += QString(tr("Theme: %1")).arg(sTheme) + "\n"; |
|
357 if(!sMap.isNull()) |
|
358 desc += QString(tr("Map: %1")).arg(sMap) + "\n"; |
|
359 if(!sRecord.isNull()) |
|
360 //: As in ‘recording’ |
|
361 desc += QString(tr("Record: %1")).arg(sRecord); |
|
362 } |
325 avformat_close_input(&pContext); |
363 avformat_close_input(&pContext); |
326 return desc; |
364 return desc; |
327 } |
365 } |
328 |
366 |
329 #else |
367 #else |