Procházet zdrojové kódy

movies: Python-facing read_samples should return bytes object

Also, properly returns partial buffers based on number of actual samples read
rdb před 6 roky
rodič
revize
c329a41dd3

+ 15 - 10
panda/src/movies/movieAudioCursor.cxx

@@ -93,23 +93,28 @@ read_samples(int n, Datagram *dg) {
  * This is not particularly efficient, but it may be a convenient way to
  * manipulate samples in python.
  */
-std::string MovieAudioCursor::
+vector_uchar MovieAudioCursor::
 read_samples(int n) {
-  std::ostringstream result;
+  vector_uchar result;
   int16_t tmp[4096];
   while (n > 0) {
     int blocksize = (4096 / _audio_channels);
-    if (blocksize > n) blocksize = n;
-    int words = blocksize * _audio_channels;
-    read_samples(blocksize, tmp);
-    for (int i=0; i<words; i++) {
+    if (blocksize > n) {
+      blocksize = n;
+    }
+    int nread = read_samples(blocksize, tmp);
+    if (nread == 0) {
+      return result;
+    }
+    int words = nread * _audio_channels;
+    for (int i = 0; i < words; ++i) {
       int16_t word = tmp[i];
-      result.put((char)(word & 255));
-      result.put((char)((word>>8) & 255));
+      result.push_back((uint8_t)(word & 255u));
+      result.push_back((uint8_t)((word >> 8) & 255u));
     }
-    n -= blocksize;
+    n -= nread;
   }
-  return result.str();
+  return result;
 }
 
 

+ 1 - 1
panda/src/movies/movieAudioCursor.h

@@ -48,7 +48,7 @@ PUBLISHED:
   virtual int ready() const;
   virtual void seek(double offset);
   void read_samples(int n, Datagram *dg);
-  std::string read_samples(int n);
+  vector_uchar read_samples(int n);
 
 public:
   virtual int read_samples(int n, int16_t *data);