LINUX.ORG.RU

Как отдебажить GPU?

 , , , ,


1

1

У меня в браузере Хром не понятно работает декодирование h264 некоторых видео, с включенным hardware acceleration. Как я понимаю (из логов chrome://media-internals/), хром при рендеринге(и демультиплексировании?) использует DXVA, тобишь DirectX (да, я тестирую на Windows 7)

Собственно проблема в том, что видео останавливается на некотором участке времени (иногда случайным образом, иногда стабильно на X секунде). Если отключить аппаратное ускорение, то проблема исчезает. Также такие видео нормально воспроизводят нативные плееры и другие браузеры (Лиса, Андроид), просто на секунду затыкаются, но воспроизведение продолжает идти дальше (в хроме тупо останавливается с ошибкой DECODER_UNDERFLOW)

Пытался собрать Chromium, скачал около 50Гб исходников, думал собрать дебажную версию и смотреть логи, но сборка не удалась, т.к. мало опыта с Visual Studio

Я правильно понимаю, что h264 декодирует системная либа DirectX? Если так, то как посмотреть лог этого декодирования и понять причину остановки?

Вот лог chrome://media-internals

Timestamp	Property	Value
00:00:00.000	origin_url	"file:///"
00:00:00.000	kFrameUrl	"file:///C:/Downloads/bad_7s.mp4"
00:00:00.000	kFrameTitle	""
00:00:00.000	url	"file:///C://Downloads/bad_7s.mp4"
00:00:00.006	kTotalBytes	13321640
00:00:00.006	kIsStreaming	false
00:00:00.006	kIsSingleOrigin	true
00:00:00.006	kIsRangeHeaderSupported	true
00:00:00.007	pipeline_state	"kStarting"
00:00:00.018	info	"FFmpegDemuxer: created video stream, config codec: h264, profile: h264 baseline, level: not available, alpha_mode: is_opaque, coded size: [480,270], visible rect: [0,0,480,270], natural size: [480,270], has extra data: true, encryption scheme: Unencrypted, rotation: 0°, flipped: 0, color space: {primaries:SMPTE170M, transfer:SMPTE170M, matrix:SMPTE170M, range:LIMITED}"
00:00:00.018	kAudioTracks	[]
00:00:00.018	kVideoTracks	[{"alpha mode":"is_opaque","codec":"h264","coded size":"480x270","color space":"{primaries:SMPTE170M, transfer:SMPTE170M, matrix:SMPTE170M, range:LIMITED}","encryption scheme":"Unencrypted","has extra data":true,"hdr metadata":"unset","natural size":"480x270","orientation":"0°","profile":"h264 baseline","visible rect":"0,0 480x270"}]
00:00:00.018	kMaxDuration	64.331
00:00:00.018	kStartTime	0
00:00:00.018	kBitrate	1656637
00:00:00.018	error	"{\"causes\":[{\"causes\":[],\"data\":{},\"stack\":[{\"file\":\"../../media/filters/decrypting_video_decoder.cc\",\"line\":53}],\"status_code\":264,\"status_message\":\"\"}],\"data\":{\"Decoder name\":\"DecryptingVideoDecoder\"},\"stack\":[{\"file\":\"../../media/filters/decoder_selector.cc\",\"line\":172}],\"status_code\":265,\"status_message\":\"\"}"
00:00:00.039	info	"Starting Initialization of DXVAVDA"
00:00:00.040	info	"Using D3D9 device for DXVA"
00:00:00.060	kIsVideoDecryptingDemuxerStream	false
00:00:00.060	kVideoDecoderName	"MojoVideoDecoder"
00:00:00.060	kIsPlatformVideoDecoder	true
00:00:00.060	info	"Selected MojoVideoDecoder for video decoding, config: codec: h264, profile: h264 baseline, level: not available, alpha_mode: is_opaque, coded size: [480,270], visible rect: [0,0,480,270], natural size: [480,270], has extra data: true, encryption scheme: Unencrypted, rotation: 0°, flipped: 0, color space: {primaries:SMPTE170M, transfer:SMPTE170M, matrix:SMPTE170M, range:LIMITED}"
00:00:00.060	pipeline_state	"kPlaying"
00:00:00.086	dimensions	"480x270"
00:00:00.086	kResolution	"480x270"
00:00:00.129	video_buffering_state	{"state":"BUFFERING_HAVE_ENOUGH"}
00:00:00.129	pipeline_buffering_state	{"for_suspended_start":false,"state":"BUFFERING_HAVE_ENOUGH"}
00:00:00.129	info	"Effective playback rate changed from 0 to 1"
00:00:00.129	event	"kPlay"
00:00:00.775	info	"Starting Initialization of DXVAVDA"
00:00:00.775	info	"Using D3D9 device for DXVA"
00:00:00.840	info	"Starting Initialization of DXVAVDA"
00:00:00.841	info	"Using D3D9 device for DXVA"
00:00:00.018	duration	64.331
00:00:04.070	info	"Starting Initialization of DXVAVDA"
00:00:04.071	info	"Using D3D9 device for DXVA"
00:00:06.488	info	"Starting Initialization of DXVAVDA"
00:00:06.489	info	"Using D3D9 device for DXVA"
00:00:07.359	video_buffering_state	{"reason":"DECODER_UNDERFLOW","state":"BUFFERING_HAVE_NOTHING"}
00:00:07.359	pipeline_buffering_state	{"for_suspended_start":false,"reason":"DECODER_UNDERFLOW","state":"BUFFERING_HAVE_NOTHING"}


Как видно из лога, Хром выбирает видео декодер MojoVideoDecoder, это и есть hardware acceleration, потом идут бесконечные «Starting Initialization of DXVAVDA», тоже не понятно почему. На других видео такого нет. В итоге видео останавливается на 7 сек. Пишет что якобы в декодере нет данных для обработки, хотя все видео забуферезировалось в плеере (1 минута)


Пример видео, которое останавливается на 7 сек.
https://bugs.chromium.org/p/chromium/issues/attachment?aid=459480&signed_...

★★★★

Я бы посоветовал начать с чего-то более простого. Ты говоришь, что видео останавливается. Значит плеер переходит из состояния «проигрывается» (активна кнопка «пауза») в состояние «остановлено» (кнопка «пауза» становится неактивной и появляется кнопка «проиграть»). Значит кто-то шлёт колбек «прекратить проигрывать видео» (там наверняка цепочка колбеков: один шлёт, второй пересылает в очередь, третий шлёт из очереди, четвертый пересылает и т.д.). Попробуй определить по какой причине это происходит (найти самое первое событие).

Другой вариант: Хром использует какую-то либу для проигрывания видео. Попробуй её запустить на этом видео самостоятельно и посмотреть что происходит.

Marvel ()
Последнее исправление: Marvel (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Затыкается во всех, но на пол секунды и снова продолжает играть, а в одном хроме останавливается и все. Не только в этом только файле проблема, могу десяток других выложить, там такая же проблема

gobot ★★★★ ()

Похоже это рабочая задача, не хочешь проследовать в job?

Смотрел кусок твоего видео, источник плох судя по гуляющему duration.

frame|media_type=video|stream_index=0|key_frame=0|pkt_pts=18128|pkt_pts_time=1.133000|pkt_dts=18128|pkt_dts_time=1.133000|best_effort_timestamp=18128|best_effort_timestamp_time=1.133000|pkt_duration=96|pkt_duration_time=0.006000|pkt_pos=237803|pkt_size=7089|width=480|height=270|pix_fmt=yuv420p|sample_aspect_ratio=N/A|pict_type=P|coded_picture_number=25|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=unknown|color_space=unknown|color_primaries=unknown|color_transfer=unknown|chroma_location=left
frame|media_type=video|stream_index=0|key_frame=0|pkt_pts=18224|pkt_pts_time=1.139000|pkt_dts=18224|pkt_dts_time=1.139000|best_effort_timestamp=18224|best_effort_timestamp_time=1.139000|pkt_duration=1024|pkt_duration_time=0.064000|pkt_pos=244892|pkt_size=6462|width=480|height=270|pix_fmt=yuv420p|sample_aspect_ratio=N/A|pict_type=P|coded_picture_number=26|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=unknown|color_space=unknown|color_primaries=unknown|color_transfer=unknown|chroma_location=left
frame|media_type=video|stream_index=0|key_frame=0|pkt_pts=19248|pkt_pts_time=1.203000|pkt_dts=19248|pkt_dts_time=1.203000|best_effort_timestamp=19248|best_effort_timestamp_time=1.203000|pkt_duration=192|pkt_duration_time=0.012000|pkt_pos=251354|pkt_size=4097|width=480|height=270|pix_fmt=yuv420p|sample_aspect_ratio=N/A|pict_type=P|coded_picture_number=27|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=unknown|color_space=unknown|color_primaries=unknown|color_transfer=unknown|chroma_location=left

anonymous ()
Ответ на: комментарий от gobot

Должен прилететь волшебник в голубом вертолете и бесплатно показать кино. А что ты думал должно произойти? Зачем спрашивать как отдебажить гпу если ты не собираешься этого делать? Ты тут ищешь кто за тебя это сделает? Ну желаю удачи наверное.

anonymous ()
Ответ на: комментарий от anonymous

Нашел уже на хабре как сделать. Там много замут с хромом. Его нужно запускать с флагом --no-sandbox, потом искать дочерний процес который отвечает за gpu, но в этом режиме хром не включает hardware acceleration почему то, идет через ffmpeg decoder

gobot ★★★★ ()
Ответ на: комментарий от anonymous

Я тоже смотрел через ffprobe. Чем плох «гуляющий duration»? Я как понял это pkt_duration? Причем тут job? Я не прошу ничего делать за меня, я хочу лишь понять чем плохо то видео, которое в гребаном хроме не работает

gobot ★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Багрепорт написал уже давно и они его уже начали обсуждать. Сколько будут мусолить, месяц или год не понятно. Проще мне изменить кодировщик наверное. Вот только бы знать что менять

gobot ★★★★ ()
Ответ на: комментарий от gobot

не факт что получится, т.к. аппаратный декодер в видеокарте это вещь в себе, но попробовать стоит, возможно дело можно решить обработкой ошибки хардварного декодера и пропуском кадра(-ов)

cobold ★★★ ()
Ответ на: комментарий от anonymous

зачем ты отправляешь их в джоб, ты так тралируешь?

оп, ну сделай хоть что-нибудь, поменяй какую-нибудь настройку кодирования. если не знаешь какую, то поменяй любую. их же там не бесконечное количество, за час перепробуешь все. час - это меньше чем месяц спрашивать что там могло сломаться. мы не знаем. но если сидеть на попе ровно и ничего не делать, то ничего и не изменится.

p.s. ты слишком глубоко копаешь.

anonymous ()