Перед ответом добавьте некоторый фон, объяснив, что это HEAD
.
First of all what is HEAD?
HEAD
- просто ссылка на текущая фиксация (последняя) в текущей ветке. В любой момент времени может быть только один HEAD
. (исключая git worktree
)
Содержимое HEAD
сохраняется внутри .git/HEAD
и содержит 40 байтов SHA-1 текущего фиксации.
detached HEAD
Если вы не используете последнюю фиксацию - это означает, что HEAD
указывает на предыдущую фиксацию в истории, ее назвали detached HEAD
.
В командной строке это будет выглядеть так: SHA-1 вместо имени ветки, так как HEAD
не указывает на кончик текущей ветви
git checkout
git checkout
git checkout -b
git checkout HEAD~X // x is the number of commits t go back
Это проверит новую ветвь, указывающую на требуемую фиксацию. Эта команда будет проверять заданную фиксацию. На этом этапе вы можете создать ветвь и начать работать с этой точки.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout
# create a new branch forked to the given commit
git checkout -b
git reflog
Вы всегда можете используйте reflog
. git reflog
отобразит любое изменение, которое обновило HEAD
и проверив нужную запись reflog, установит HEAD
обратно на эту фиксацию.
Каждый раз, когда HEAD изменяется, в reflog
git reflog
git checkout HEAD@{...}
появится новая запись. Это вернет вас к вашему желаемому фиксации
git reset --hard
«Переместить» HEAD обратно в нужное commit.
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
git rebase --no-autostash
. git revert
«Отменить» заданный диапазон фиксации или фиксации. Команда reset «отменяет» любые изменения, сделанные в данной фиксации. Новая фиксация с патчем undo будет совершена, в то время как исходная фиксация останется в истории.
# add new commit with the undo of the original one.
# the can be any commit(s) or commit range
git revert
Эта схема иллюстрирует, какая команда выполняет что. Как вы можете видеть там reset && checkout
, измените HEAD
.
В итоге я удалил растровую часть кода. И это сработало! Поэтому ранее я преобразовывал кадр в растровое изображение, и он копировал пиксели из растрового изображения в Texture2D. Я посмотрел поближе и понял, что могу пропустить этот шаг растрового изображения. Прошу прощения за то, что недостаточно ясно дал понять по моему вопросу.
/// <summary>
/// Converts Frame to Texture
/// </summary>
/// <returns>Texture2D</returns>
public Texture2D FrameToTexture2D()
{
Texture2D frameTex = new Texture2D(Memory.spriteBatch.GraphicsDevice, Decoder.CodecContext->width, Decoder.CodecContext->height, false, SurfaceFormat.Color);
const int bpp = 4;
byte[] texBuffer = new byte[Decoder.CodecContext->width * Decoder.CodecContext->height * bpp];
fixed (byte* ptr = &texBuffer[0])
{
byte*[] srcData = { ptr, null, null, null };
int[] srcLinesize = { Decoder.CodecContext->width * bpp, 0, 0, 0 };
// convert video frame to the RGB data
ffmpeg.sws_scale(ScalerContext, Decoder.Frame->data, Decoder.Frame->linesize, 0, Decoder.CodecContext->height, srcData, srcLinesize);
}
frameTex.SetData(texBuffer);
return frameTex;
}