2012-11-08 12 views
16

Próbowałem znaleźć to, co każda komórka AVFrame.linesize[] znaczy, ale nie znalazłem.Czy ktoś może pomóc w zrozumieniu AVFrame.linesize []?

Jak rozumiem, linesize[0] to szerokość, linesize[1] to wysokość.

  1. Jeśli mam rację, co oznaczają inne komórki?
  2. dlaczego po avcodec_decode_video2(codecCtxDecode, frameDecoded, &frameFinished, &packet); tylko liniezuj [0] ma wartość, a pozostałe komórki są zawsze 0?

AKTUALIZACJA

myślę AVFrame.data [i] i AVFrame.linesize [i] są dane o określonym kolorze w rzędzie i długości rzędu, mam rację?

Odpowiedz

23

W przypadku danych planarnych, takich jak YUV420, linesize[i] zawiera krok dla i -ty.

Na przykład, dla ramki 640x480data[0] zawiera wskaźnik Y składnik, i data[2] zawiera wskaźniki do U i V płaszczyznach. W tym przypadku, linesize[0] == 640, linesize[1] == linesize[2] == 320 (bo U i V samolotów jest mniej niż Y samolot pół)

w przypadku danych pikseli (RGB24), jest tylko jeden samolot (data[0]) i linesize[0] == width * channels (640 * 3 dla RGB24)

+0

cześć, po 'avcodec_decode_video2 (dc, yuvFrame, & got_picture, & h264pack);' jeśli wydrukuję 'linesize', to nie jest tak, jak powiedziałeś. dlaczego lineize jest tak ogromne (duża 8-cyfrowa liczba)? – nmxprime

11

Zapraszamy do obejrzenia opisu formatów kadru wideo:

Zobaczysz, że formaty są podzielone na dwie duże grupy: pakowane i płaskie, w zależności od tego, czy komponenty są przechowywane osobno, czy przeplatane. Strides mają dla nich nieco inne znaczenie i zasadniczo są to liczba bajtów, które trzeba przeskoczyć, aby przejść o jeden wiersz dalej.

Powiązane problemy