Can't we take VideoThumbLoader.cpp;L124 as a model and incorporate 3D detection in DemuxerToStreamDetails (called from GetFileStreamDetails) ?
This way, 
- we don't care that streamdetails are overridden at each play (assuming DemuxerToStreamDetails also does the job there).
- the value gets written in db

Indeed, we'd still have to do a db check for an user override, though.

VideoThumbLoader.cpp;L124 :
```
  else if (!m_item.HasVideoInfoTag() || !m_item.GetVideoInfoTag()->HasStreamDetails())
  {
    // No tag or no details set, so extract them
    CLog::Log(LOGDEBUG,"%s - trying to extract filestream details from video file %s", __FUNCTION__, CURL::GetRedacted(m_item.GetPath()).c_str());
    result = CDVDFileInfo::GetFileStreamDetails(&m_item);
  }

  if (result)
  {
    CVideoInfoTag* info = m_item.GetVideoInfoTag();
    CVideoDatabase db;
    if (db.Open())
    {
      if (info->m_iFileId < 0)
        db.SetStreamDetailsForFile(info->m_streamDetails, !info->m_strFileNameAndPath.empty() ? info->m_strFileNameAndPath : m_item.GetPath());
      else
        db.SetStreamDetailsForFileId(info->m_streamDetails, info->m_iFileId);

      db.Close();
    }
    return true;
  }
```