Hi, i am using your project to decoder video stream from drones. I found that there is a memory leak when decoding the data. Here is the code:
import socket
import h264decoder
from scanner import Scanner
import queue
from memory_profiler import profile
@profile
def _h264_decode(packet_data, decoder, queue):
frames = decoder.decode(packet_data)
for frame_data in frames:
(frame, w, h, ls) = frame_data
if frame is not None:
frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
frame = (frame.reshape((h, ls // 3, 3)))
frame = frame[:, :w, :]
while queue.qsize() > 1:
queue.get()
queue.put(frame)
def _receive_video_thread(video_socket, decoder, queue):
pack_data = ''
print("receive video thread start....")
while True:
try:
res_string, ip = video_socket.recvfrom(2048)
pack_data += res_string.hex()
if len(res_string) != 1460:
tmp = bytes.fromhex(pack_data)
_h264_decode(tmp, decoder , queue)
pack_data = ''
except socket.error as exc:
print("Caught exception socket.error(video_thread): %s" % exc)
scanner = Scanner('192.168.1.')
scanner.find_available_tello(1)
tello_list = scanner.get_tello_info()
print(tello_list)
video_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
video_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 10 * 1024)
video_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
video_socket.bind(('', tello_list[0][2]))
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
soc.bind(('', tello_list[0][1]))
soc.sendto('streamon'.encode('utf-8'), (tello_list[0][0], 8889))
queue = queue.Queue()
decoder = h264decoder.H264Decoder()
_receive_video_thread(video_socket, decoder, queue)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3080.6 MiB 3080.6 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3082.5 MiB 1.8 MiB 1 frames = decoder.decode(packet_data)
11 3082.5 MiB 0.0 MiB 2 for frame_data in frames:
12 3082.5 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3082.5 MiB 0.0 MiB 1 if frame is not None:
14 3082.5 MiB 0.0 MiB 1 print("get image.")
15 3082.5 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3082.5 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3082.5 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3082.5 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3082.5 MiB 0.0 MiB 1 queue.get()
20 3082.5 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3082.5 MiB 3082.5 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3084.5 MiB 2.1 MiB 1 frames = decoder.decode(packet_data)
11 3084.5 MiB 0.0 MiB 2 for frame_data in frames:
12 3084.5 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3084.5 MiB 0.0 MiB 1 if frame is not None:
14 3084.5 MiB 0.0 MiB 1 print("get image.")
15 3084.5 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3084.5 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3084.5 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3084.5 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3084.5 MiB 0.0 MiB 1 queue.get()
20 3084.5 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3084.5 MiB 3084.5 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3086.6 MiB 2.1 MiB 1 frames = decoder.decode(packet_data)
11 3086.6 MiB 0.0 MiB 2 for frame_data in frames:
12 3086.6 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3086.6 MiB 0.0 MiB 1 if frame is not None:
14 3086.6 MiB 0.0 MiB 1 print("get image.")
15 3086.6 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3086.6 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3086.6 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3086.6 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3086.6 MiB 0.0 MiB 1 queue.get()
20 3086.6 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3086.6 MiB 3086.6 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3088.4 MiB 1.8 MiB 1 frames = decoder.decode(packet_data)
11 3088.4 MiB 0.0 MiB 2 for frame_data in frames:
12 3088.4 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3088.4 MiB 0.0 MiB 1 if frame is not None:
14 3088.4 MiB 0.0 MiB 1 print("get image.")
15 3088.4 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3088.4 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3088.4 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3088.4 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3088.4 MiB 0.0 MiB 1 queue.get()
20 3088.4 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3088.4 MiB 3088.4 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3090.4 MiB 2.1 MiB 1 frames = decoder.decode(packet_data)
11 3090.4 MiB 0.0 MiB 2 for frame_data in frames:
12 3090.4 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3090.4 MiB 0.0 MiB 1 if frame is not None:
14 3090.4 MiB 0.0 MiB 1 print("get image.")
15 3090.4 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3090.4 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3090.4 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3090.4 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3090.4 MiB 0.0 MiB 1 queue.get()
20 3090.4 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3090.4 MiB 3090.4 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3092.5 MiB 2.1 MiB 1 frames = decoder.decode(packet_data)
11 3092.5 MiB 0.0 MiB 2 for frame_data in frames:
12 3092.5 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3092.5 MiB 0.0 MiB 1 if frame is not None:
14 3092.5 MiB 0.0 MiB 1 print("get image.")
15 3092.5 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3092.5 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3092.5 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3092.5 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3092.5 MiB 0.0 MiB 1 queue.get()
20 3092.5 MiB 0.0 MiB 1 queue.put(frame)
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3092.5 MiB 3092.5 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3092.5 MiB 0.0 MiB 1 frames = decoder.decode(packet_data)
11 3092.5 MiB 0.0 MiB 1 for frame_data in frames:
12 (frame, w, h, ls) = frame_data
13 if frame is not None:
14 print("get image.")
15 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 frame = (frame.reshape((h, ls // 3, 3)))
17 frame = frame[:, :w, :]
18 while queue.qsize() > 1:
19 queue.get()
20 queue.put(frame)
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3092.5 MiB 3092.5 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3092.5 MiB 0.0 MiB 1 frames = decoder.decode(packet_data)
11 3092.5 MiB 0.0 MiB 1 for frame_data in frames:
12 (frame, w, h, ls) = frame_data
13 if frame is not None:
14 print("get image.")
15 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 frame = (frame.reshape((h, ls // 3, 3)))
17 frame = frame[:, :w, :]
18 while queue.qsize() > 1:
19 queue.get()
20 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3092.5 MiB 3092.5 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3094.3 MiB 1.8 MiB 1 frames = decoder.decode(packet_data)
11 3094.3 MiB 0.0 MiB 2 for frame_data in frames:
12 3094.3 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3094.3 MiB 0.0 MiB 1 if frame is not None:
14 3094.3 MiB 0.0 MiB 1 print("get image.")
15 3094.3 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3094.3 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3094.3 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3094.3 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3094.3 MiB 0.0 MiB 1 queue.get()
20 3094.3 MiB 0.0 MiB 1 queue.put(frame)
get image.
Filename: /home/jakeluo/Documents/tello_project/video_test.py
Line # Mem usage Increment Occurences Line Contents
============================================================
8 3094.3 MiB 3094.3 MiB 1 @profile
9 def _h264_decode(packet_data, decoder, queue):
10 3096.4 MiB 2.1 MiB 1 frames = decoder.decode(packet_data)
11 3096.4 MiB 0.0 MiB 2 for frame_data in frames:
12 3096.4 MiB 0.0 MiB 1 (frame, w, h, ls) = frame_data
13 3096.4 MiB 0.0 MiB 1 if frame is not None:
14 3096.4 MiB 0.0 MiB 1 print("get image.")
15 3096.4 MiB 0.0 MiB 1 frame = np.fromstring(frame, dtype=np.ubyte, count=len(frame), sep='')
16 3096.4 MiB 0.0 MiB 1 frame = (frame.reshape((h, ls // 3, 3)))
17 3096.4 MiB 0.0 MiB 1 frame = frame[:, :w, :]
18 3096.4 MiB 0.0 MiB 2 while queue.qsize() > 1:
19 3096.4 MiB 0.0 MiB 1 queue.get()
20 3096.4 MiB 0.0 MiB 1 queue.put(frame)
the function decode() is the cause of the memory leak. I have tried to fix it by myself, but i am not familiar with C++ and libav. Could you please tell me how to solve this problem?