Fix video aspect ratio

This commit is contained in:
nmzik
2026-09-20 15:15:32 +04:00
parent a849f25376
commit 25f2699523
+7 -14
View File
@@ -1405,15 +1405,8 @@ private:
return use_vdec2 ? static_cast<uint32_t>(s->codecpar->height) return use_vdec2 ? static_cast<uint32_t>(s->codecpar->height)
: align_up(static_cast<uint32_t>(s->codecpar->height), 16); : align_up(static_cast<uint32_t>(s->codecpar->height), 16);
} }
float Aspect(AVStream* s) const { float Aspect(AVRational ratio) const {
if (s->codecpar->height == 0) { return ratio.num > 0 && ratio.den > 0 ? static_cast<float>(av_q2d(ratio)) : 0.0f;
return 0.0f;
}
double r = static_cast<double>(s->codecpar->width) / s->codecpar->height;
if (s->sample_aspect_ratio.num > 0 && s->sample_aspect_ratio.den > 0) {
r *= av_q2d(s->sample_aspect_ratio);
}
return static_cast<float>(r);
} }
uint64_t Duration(AVStream* s) const { uint64_t Duration(AVStream* s) const {
return s->duration != AV_NOPTS_VALUE return s->duration != AV_NOPTS_VALUE
@@ -1426,14 +1419,14 @@ private:
std::memset(v, 0, sizeof(*v)); std::memset(v, 0, sizeof(*v));
v->width = Width(s); v->width = Width(s);
v->height = Height(s); v->height = Height(s);
v->aspect_ratio = Aspect(s); v->aspect_ratio = Aspect(s->sample_aspect_ratio);
lang(v->language_code, s->metadata); lang(v->language_code, s->metadata);
} }
void FillVideoEx(AVStream* s, AvPlayerVideoEx* v) const { void FillVideoEx(AVStream* s, AvPlayerVideoEx* v, AVRational aspect) const {
std::memset(v, 0, sizeof(*v)); std::memset(v, 0, sizeof(*v));
v->width = Width(s); v->width = Width(s);
v->height = Height(s); v->height = Height(s);
v->aspect_ratio = Aspect(s); v->aspect_ratio = Aspect(aspect);
v->pitch = VideoPitch(s); v->pitch = VideoPitch(s);
v->luma_bit_depth = 8; v->luma_bit_depth = 8;
v->chroma_bit_depth = 8; v->chroma_bit_depth = 8;
@@ -1469,7 +1462,7 @@ private:
FillVideo(s, &d->video); FillVideo(s, &d->video);
} }
if (ex) { if (ex) {
FillVideoEx(s, &ex->video); FillVideoEx(s, &ex->video, s->sample_aspect_ratio);
} }
break; break;
case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_AUDIO:
@@ -1554,7 +1547,7 @@ private:
info->time_stamp = to_ms( info->time_stamp = to_ms(
src->best_effort_timestamp != AV_NOPTS_VALUE ? src->best_effort_timestamp : src->pts, src->best_effort_timestamp != AV_NOPTS_VALUE ? src->best_effort_timestamp : src->pts,
s->time_base); s->time_base);
FillVideoEx(s, &info->details.video); FillVideoEx(s, &info->details.video, src->sample_aspect_ratio);
info->details.video.crop_left_offset = static_cast<uint32_t>(src->crop_left); info->details.video.crop_left_offset = static_cast<uint32_t>(src->crop_left);
info->details.video.crop_right_offset = info->details.video.crop_right_offset =
static_cast<uint32_t>(src->crop_right + (pitch - src->width)); static_cast<uint32_t>(src->crop_right + (pitch - src->width));